/ Hex Artifact Content
Login

Artifact b07ae2a2b9800250064ab487ef704a67c7fb5c9d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 35  : pager.c,v 1.45
0350: 33 20 32 30 30 38 2f 30 36 2f 30 36 20 31 31 3a  3 2008/06/06 11:
0360: 31 31 3a 32 36 20 64 61 6e 69 65 6c 6b 31 39 37  11:26 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0690: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
06a0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
06b0: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
06c0: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06d0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06e0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06f0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
0700: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
0710: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0720: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0730: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0740: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0750: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0760: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0770: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0790: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
07a0: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
07b0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07c0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07e0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
0800: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0810: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0820: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0840: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0850: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0860: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0890: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
08a0: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
08b0: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08c0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08f0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
0900: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0930: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0940: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0950: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0960: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0970: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0990: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
09a0: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
09b0: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09c0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09f0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
0a00: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
0a10: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a40: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a50: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a60: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a90: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0aa0: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ad0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ae0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0af0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b20: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b30: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b40: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b70: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b80: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0ba0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0bc0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bd0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0be0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0c10: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c20: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c30: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c40: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c50: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c60: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c80: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c90: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0ca0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cd0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0ce0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cf0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d10: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d20: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d30: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d90: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0da0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0db0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0dc0: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0dd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0de0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0df0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0e00: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0e10: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0e20: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e30: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e40: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e50: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e60: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e70: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e80: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e90: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0ea0: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0eb0: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0ec0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ed0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0ee0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ef0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f00: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f10: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f20: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f30: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f40: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f50: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f60: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f70: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f80: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f90: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0fa0: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0fb0: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0fc0: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fd0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fe0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0ff0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
1000: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1010: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
1020: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1030: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1050: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1060: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1070: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1080: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1090: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
10a0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
10b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
10c0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10d0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10e0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10f0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
1100: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
1110: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1130: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1140: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1150: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1160: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1170: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1180: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1190: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
11a0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
11b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
11c0: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11d0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
1200: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
1210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
1220: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1230: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1240: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1250: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1260: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1270: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1280: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1290: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
12a0: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
12b0: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
12c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12d0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12e0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12f0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
1300: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1310: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
1320: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1330: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1340: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1350: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1360: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1370: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1380: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1390: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
13a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13b0: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
13c0: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13d0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13e0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13f0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
1400: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
1410: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
1420: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1430: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1440: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1450: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1460: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1470: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1480: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1490: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
14a0: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
14b0: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
14c0: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14d0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14e0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1500: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
1510: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
1520: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1540: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1550: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1560: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1570: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1580: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1590: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
15a0: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
15b0: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
15c0: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15d0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15e0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15f0: 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66 20 73  )&~7)..typedef s
1600: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
1610: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 70  r;../*.** Each p
1620: 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c 6c 20  ager stores all 
1630: 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 66 65  currently unrefe
1640: 72 65 6e 63 65 64 20 70 61 67 65 73 20 69 6e 20  renced pages in 
1650: 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a 2a 2a  a list sorted.**
1660: 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65 6e 74   in least-recent
1670: 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20 6f 72  ly-used (LRU) or
1680: 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20 66 69  der (i.e. the fi
1690: 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  rst item on the 
16a0: 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e 6f 74  list has .** not
16b0: 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
16c0: 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d 65 2c   in a long time,
16d0: 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 68   the last item h
16e0: 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74 6c 79  as been recently
16f0: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20 69 6e  .** used). An in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1710: 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 63 6c  tructure is incl
1720: 75 64 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  uded as part of 
1730: 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20 73 74  each.** pager st
1740: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1750: 20 70 75 72 70 6f 73 65 20 28 76 61 72 69 61 62   purpose (variab
1760: 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e 0a 2a  le Pager.lru)..*
1770: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1780: 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  y, if memory-man
1790: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
17a0: 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ed, all unrefere
17b0: 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a 20 61  nced pages .** a
17c0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 67  re stored in a g
17d0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 20 28  lobal LRU list (
17e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
17f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1800: 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  st)..**.** In bo
1810: 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 50 61  th cases, the Pa
1820: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
1830: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
1840: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1850: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
1860: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1870: 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f 65 73  g list that does
1880: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 0a   not require an.
1890: 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61  ** fsync() opera
18a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 73 20  tion before its 
18b0: 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 72 65  memory can be re
18c0: 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e 6f 20 73  claimed. If no s
18d0: 75 63 68 0a 2a 2a 20 70 61 67 65 20 65 78 69 73  uch.** page exis
18e0: 74 73 2c 20 50 61 67 65 72 4c 72 75 4c 69 73 74  ts, PagerLruList
18f0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 69 73  .pFirstSynced is
1900: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
1910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1920: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50 61 67  PagerLruList Pag
1930: 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72 75 63  erLruList;.struc
1940: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 7b  t PagerLruList {
1950: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1960: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ;         /* Fir
1970: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
1980: 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1990: 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
19a0: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
19b0: 4c 52 55 20 6c 69 73 74 20 28 74 68 65 20 6d 6f  LRU list (the mo
19c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
19d0: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  ) */.  PgHdr *pF
19e0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a  irstSynced;   /*
19f0: 20 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c   First page in l
1a00: 69 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ist with PgHdr.n
1a10: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b  eedSync==0 */.};
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1a40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 78  contains the nex
1a50: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 70  t and previous p
1a60: 6f 69 6e 74 65 72 73 20 75 73 65 64 0a 2a 2a 20  ointers used.** 
1a70: 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48 64 72 20  to link a PgHdr 
1a80: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 61  structure into a
1a90: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 69   PagerLruList li
1aa0: 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a 2f 0a 74  nked list. .*/.t
1ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1ac0: 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61 67 65 72  gerLruLink Pager
1ad0: 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20  LruLink;.struct 
1ae0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 7b 0a 20  PagerLruLink {. 
1af0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
1b00: 20 50 67 48 64 72 20 2a 70 50 72 65 76 3b 0a 7d   PgHdr *pPrev;.}
1b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  ;../*.** Each in
1b20: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1b30: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1b40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1b50: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1b60: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1b70: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1b80: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1b90: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1ba0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1bb0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1bc0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1bd0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1be0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1bf0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1c00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c10: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1c20: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1c30: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1c40: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1c50: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1c60: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c70: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1c80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1c90: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1ca0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cb0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1cc0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1cd0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1ce0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1cf0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1d00: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1d10: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1d20: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1d30: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1d40: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1d50: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1d60: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1d70: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1d80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1d90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1da0: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1db0: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1dc0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1dd0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1de0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1df0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1e00: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1e10: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1e20: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1e30: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e40: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1e50: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1e60: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1e70: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1e80: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1e90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1ea0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ile..**.** Detai
1eb0: 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20  ls of important 
1ec0: 73 74 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e  structure elemen
1ed0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ts:.**.** needSy
1ee0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  nc.**.**     If 
1ef0: 74 68 69 73 20 69 73 20 74 72 75 65 2c 20 74 68  this is true, th
1f00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74  is means that it
1f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
1f20: 77 72 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a  write the page.*
1f30: 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f  *     content to
1f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1f50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
1f60: 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65  al content neede
1f70: 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c  d.**     for rol
1f80: 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79  lback has not by
1f90: 20 73 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d   synced to the m
1fa0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
1fb0: 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65  rnal..**     The
1fc0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1fd0: 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  t may have been 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72  written to the r
1ff0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
2000: 2a 2a 20 20 20 20 20 62 75 74 20 69 74 20 68 61  **     but it ha
2010: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73  s not yet been s
2020: 79 6e 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61  ynced.  So we ca
2030: 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68  nnot write to th
2040: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2050: 20 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 70    file because p
2060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67  ower failure mig
2070: 68 74 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ht cause the pag
2080: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
2090: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20   file.**     to 
20a0: 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 65 20  never reach the 
20b0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20  disk.  It is as 
20c0: 69 66 20 74 68 65 20 77 72 69 74 65 20 74 6f 20  if the write to 
20d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e0: 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74  .**     does not
20f0: 20 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65   occur until the
2100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2110: 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20   synced..**     
2120: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2130: 67 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  g is false if th
2140: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65  e page content e
2150: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77  xactly matches w
2160: 68 61 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65  hat.**     curre
2170: 6e 74 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74  ntly exists in t
2180: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2190: 2e 20 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20  .  The needSync 
21a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  flag is also.** 
21b0: 20 20 20 20 66 61 6c 73 65 20 69 66 20 74 68 65      false if the
21c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21d0: 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  t has been writt
21e0: 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  en to the main r
21f0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a  ollback.**     j
2200: 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65  ournal and synce
2210: 64 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  d.  If the page 
2220: 72 65 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77  represents a new
2230: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a   page that has.*
2240: 2a 20 20 20 20 20 62 65 65 6e 20 61 64 64 65 64  *     been added
2250: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
2270: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
2280: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
2290: 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e  ion, the needSyn
22a0: 63 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 75  c flag is true u
22b0: 6e 74 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61  ntil the origina
22c0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  l database.**   
22d0: 20 20 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f    size in the jo
22e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
22f0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2300: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f  disk..**.** inJo
2310: 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urnal.**.**     
2320: 54 68 69 73 20 69 73 20 74 72 75 65 20 69 66 20  This is true if 
2330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2340: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2350: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
2360: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
2370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
2380: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
2390: 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 61 64  for new pages ad
23a0: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
23b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23c0: 61 62 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e  abase file durin
23d0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20  ansaction..**   
23f0: 20 20 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20    And this flag 
2400: 73 61 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f  says nothing abo
2410: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
2420: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  t the journal.**
2430: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 73 79       has been sy
2440: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46  nced to disk.  F
2450: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 61 72  or pages that ar
2460: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
2470: 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73  l.**     databas
2480: 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  e file, the foll
2490: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
24a0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
24b0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24c0: 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20      inJournal = 
24d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24e0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24f0: 72 6e 61 6c 2c 20 70 67 6e 6f 29 0a 2a 2a 0a 2a  rnal, pgno).**.*
2500: 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65 72  *     The pPager
2510: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 6f 62 6a  ->pInJournal obj
2520: 65 63 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ect is only vali
2530: 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  d for the origin
2540: 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  al.**     pages 
2550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
2560: 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74   not new pages t
2570: 68 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f  hat are added to
2580: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
2590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
25a0: 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68   so obviously th
25b0: 65 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69  e above expressi
25c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  on cannot be.** 
25d0: 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65      valid for ne
25e0: 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65  w pages.  For ne
25f0: 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61  w pages inJourna
2600: 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a  l is always 0..*
2610: 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a  *.** dirty.**.**
2620: 20 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20       When true, 
2630: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2650: 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2660: 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64  .**     modified
2670: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2680: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61  le..**     If fa
26b0: 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  lse, it means th
26c0: 61 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  at either the co
26d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
26e0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68  e is.**     unch
26f0: 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68  anged or else th
2700: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69  e content is uni
2710: 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20  mportant and we 
2720: 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61  do not.**     ca
2730: 72 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  re whether or no
2740: 74 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65  t it is preserve
2750: 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52  d..**.** alwaysR
2760: 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  ollback.**.**   
2770: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2780: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2790: 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
27a0: 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a   API should be.*
27b0: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f  *     ignored fo
27c0: 72 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68  r this page.  Th
27d0: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
27e0: 20 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f   API attempts to
27f0: 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74   say.**     that
2800: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2810: 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b  the page on disk
2820: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2830: 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20  (it is an.**    
2840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20   unused page on 
2850: 74 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f  the freelist) so
2860: 20 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65   that it is unne
2870: 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20  cessary to .**  
2880: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e     rollback chan
2890: 67 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65  ges to this page
28a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
28b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
28c0: 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e  .**     can chan
28d0: 67 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ge without chang
28e0: 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  ing the meaning 
28f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2900: 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c    This.**     fl
2910: 61 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ag overrides any
2920: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2930: 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66  attempt.  This f
2940: 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  lag is set.**   
2950: 20 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68    when a page th
2960: 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  at originally co
2970: 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61  ntained valid da
2980: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  ta is added to.*
2990: 2a 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69  *     the freeli
29a0: 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68  st.  Later in th
29b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
29c0: 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69  on, this page mi
29d0: 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75  ght.**     be pu
29e0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  lled from the fr
29f0: 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  eelist and reuse
2a00: 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  d for something 
2a10: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20  different.**    
2a20: 20 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69   and at that poi
2a30: 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  nt the DontRollb
2a40: 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62  ack() API will b
2a50: 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65  e called because
2a60: 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61  .**     pages ta
2a70: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ken from the fre
2a80: 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65  elist do not nee
2a90: 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65  d to be protecte
2aa0: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
2ab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ac0: 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67  .  But this flag
2ad0: 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70   says that the p
2ae0: 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e  age was.**     n
2af0: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  ot originally pa
2b00: 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  rt of the freeli
2b10: 73 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74  st so that it st
2b20: 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20  ill needs to.** 
2b30: 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61      be rolled ba
2b40: 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61  ck in spite of a
2b50: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f  ny subsequent Do
2b60: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
2b70: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65  ls..**.** needRe
2b80: 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ad .**.**     Th
2b90: 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77  is flag means (w
2ba0: 68 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74  hen true) that t
2bb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2bc0: 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20  e page has.**   
2bd0: 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c    not yet been l
2be0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e  oaded from disk.
2bf0: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
2c00: 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a  content is just.
2c10: 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20  **     garbage. 
2c20: 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a   (Actually, we z
2c30: 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c  ero the content,
2c40: 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20   but you should 
2c50: 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20  not.**     make 
2c60: 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  any assumptions 
2c70: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2c80: 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29  t nevertheless.)
2c90: 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20    If the.**     
2ca0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
2cb0: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
2cc0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
2cd0: 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20  ad from the.**  
2ce0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61     original data
2cf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
2d00: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
2d10: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d30: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
2d40: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
2d50: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
2d60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2d90: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2da0: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
2db0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
2dc0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
2dd0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
2de0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72  .pgno */.  Pager
2df0: 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20  LruLink free;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e10: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66  t and previous f
2e20: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
2e30: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e50: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
2e60: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a  ages */.  u8 inJ
2e70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2e90: 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69   if has been wri
2ea0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
2eb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
2ee0: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
2ef0: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
2f00: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
2f30: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
2f40: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2f50: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f70: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2f80: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
2f90: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65   page */.  u8 ne
2fa0: 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20  edRead;         
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2fc0: 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67  d content if Pag
2fd0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
2fe0: 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  led */.  short i
2ff0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3010: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
3020: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
3030: 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72  dr *pDirty, *pPr
3040: 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44  evDirty;    /* D
3050: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69  irty pages */.#i
3060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3070: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
3080: 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c  MENT.  PagerLruL
3090: 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20  ink gfree;      
30a0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
30b0: 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20  list of nRef==0 
30c0: 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
30e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
30f0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
3100: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20  .  void *pData; 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a    /* Page data *
3130: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
3140: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
3150: 61 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  al data appended
3160: 20 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20   to this header 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
3180: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
3190: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
31a0: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
31b0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
31c0: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
31d0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
31e0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
31f0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
3200: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
3210: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
3220: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
3230: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
3250: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
3260: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
3270: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
3280: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
3290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
32a0: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
32b0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
32c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
32d0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
32e0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
32f0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
3300: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
3310: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
3320: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
3330: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
3340: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
3350: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
3360: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
3370: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
3380: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
3390: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
33a0: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
33b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
33c0: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
33d0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
33e0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
33f0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
3400: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
3410: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
3420: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
3430: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
3440: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
3450: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
3460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
3470: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3480: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
3490: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
34a0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
34b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
34c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
34d0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
3500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3510: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a  ubjournal */.};.
3520: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
3530: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
3540: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
3550: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
3560: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
3570: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
3580: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
3590: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
35a0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
35b0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
35c0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
35d0: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
35e0: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
35f0: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
3600: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
3610: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
3620: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
3630: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
3640: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3650: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
3660: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
3670: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
3680: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
3690: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
36a0: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
36b0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
36c0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
36d0: 5f 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29  _DATA(P)    ((P)
36e0: 2d 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65  ->pData).#define
36f0: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
3700: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
3710: 47 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  G)[1])).#define 
3720: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c  PGHDR_TO_HIST(P,
3730: 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20  PGR)  \.        
3740: 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a      ((PgHistory*
3750: 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b  )&((char*)(&(P)[
3760: 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74  1]))[(PGR)->nExt
3770: 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  ra])../*.** A op
3780: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
3790: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
37a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
37b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50  ructure..**.** P
37c0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
37d0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
37e0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
37f0: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f  CORRUPT, or.** o
3800: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
3810: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
3820: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
3830: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
3840: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
3850: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
3860: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
3870: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
3880: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
3890: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
38a0: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
38b0: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
38c0: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
38d0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
38e0: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
38f0: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
3900: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
3910: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
3920: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
3930: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
3940: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
3950: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
3960: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  Lookup().** APIs
3970: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
3980: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
3990: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
39a0: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
39b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
39c0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
39d0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
39e0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  r IO */.  u8 jou
39f0: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3a20: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3a30: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3a40: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3a50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3a60: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3a70: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3a80: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3aa0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ab0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3ac0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3ad0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3ae0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3af0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3b00: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3b10: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b30: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3b40: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3b50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3b60: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3b80: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
3b90: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
3ba0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
3bb0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
3bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
3bd0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
3be0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3bf0: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3c00: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3c10: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3c20: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3c30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3c40: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c60: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3c80: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
3c90: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3cb0: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
3cc0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
3cd0: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cf0: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
3d00: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
3d10: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
3d20: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
3d40: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
3d50: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
3d60: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3d80: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
3d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
3da0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
3dd0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3df0: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
3e20: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
3e30: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
3e40: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
3e50: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
3e60: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
3e70: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
3e80: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3eb0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ec0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
3ef0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
3f00: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
3f10: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f30: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3f40: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3f50: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3f60: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3f70: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3f80: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3f90: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3fa0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3fb0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3fd0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
3fe0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
3ff0: 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  es */.  u8 dbMod
4000: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
4010: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4020: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
4030: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
4040: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
4050: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
4060: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
4070: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
4080: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
4090: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40b0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
40c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
40d0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
4100: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
4110: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
4120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
4160: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4170: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
4180: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
4190: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
41a0: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
41c0: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
41d0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
41e0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
41f0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
4200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4210: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4220: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4230: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
4240: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4250: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4260: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4270: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
4290: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
42a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
42b0: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
42c0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
42d0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
42f0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
4300: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
4310: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
4320: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4340: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4350: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
4360: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
4370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
4380: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
4390: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
43a0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
43c0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
43d0: 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67  ry pages with Pg
43e0: 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20  Hdr.nRef>0 */.  
43f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4410: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4420: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
4430: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
4440: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
4450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4460: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
4470: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4480: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
4490: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
44a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
44b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
44c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
44d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e  */.  Bitvec *pIn
44e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
44f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4500: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4510: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
4520: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4550: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4560: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
45a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
45b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
45c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
45d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
45e0: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
45f0: 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  file *fd, *jfd; 
4600: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4610: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
4620: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
4630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4640: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
4650: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4660: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
4670: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4680: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
4690: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
46a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
46b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
46c0: 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75  er */.  PagerLru
46d0: 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20  List lru;       
46e0: 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20      /* LRU list 
46f0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
4700: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4720: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
4730: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
4740: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
4750: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4760: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
4770: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4780: 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  l */.  PgHdr *pD
4790: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
47a0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
47b0: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f  l dirty pages */
47c0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
47d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
47e0: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f  * Current byte o
47f0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
4800: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
4810: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4830: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4840: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4850: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74  ader */.  i64 st
4860: 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20  mtHdrOff;       
4870: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a        /* First j
4880: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
4890: 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65  itten this state
48a0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74  ment */.  i64 st
48b0: 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  mtCksum;        
48c0: 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e        /* cksumIn
48d0: 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e  it when statemen
48e0: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f  t was started */
48f0: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
4900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4910: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
4920: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
4930: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f  ) */.  int secto
4940: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4950: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4960: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4970: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66   rollback */.#if
4980: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4990: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
49a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
49b0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
49c0: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
49d0: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
49e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
49f0: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4a00: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4a10: 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  f.  void (*xDest
4a20: 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c  ructor)(DbPage*,
4a30: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
4a40: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
4a50: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
4a60: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
4a70: 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  ter)(DbPage*,int
4a80: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
4a90: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
4aa0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
4ab0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ac0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
4ad0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
4ae0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
4af0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
4b00: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
4b10: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
4b20: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
4b30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b40: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
4b50: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  ) */.#endif.  in
4b60: 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20  t nHash;        
4b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4b90: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  ash table */.  P
4ba0: 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20  gHdr **aHash;   
4bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4bc0: 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20  sh table to map 
4bd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50  page number to P
4be0: 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  gHdr */.#ifdef S
4bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4c00: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
4c10: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69  Doubly linked li
4c40: 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20  st of pagers on 
4c50: 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72  which */.  Pager
4c60: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
4c80: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
4c90: 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a  () will work */.
4ca0: 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69    volatile int i
4cb0: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 2f 2a  InUseMM;      /*
4cc0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61   Non-zero if una
4cd0: 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a  vailable to MM *
4ce0: 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  /.  volatile int
4cf0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4d00: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69  /* Non-zero if i
4d10: 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  n sqlite3_releas
4d20: 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65  e_memory() */.#e
4d30: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4d40: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4d50: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4d60: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4d70: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4d80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4d90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4da0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4db0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4dc0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
4dd0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
4de0: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
4df0: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
4e00: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
4e10: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   files */.};../*
4e20: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
4e30: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
4e40: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
4e50: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
4e60: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
4e70: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
4e80: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
4e90: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
4ea0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
4eb0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
4ec0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
4ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
4ee0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
4ef0: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
4f00: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
4f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
4f20: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
4f30: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
4f40: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
4f50: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
4f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
4f70: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
4f80: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
4f90: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
4fa0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
4fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
4fc0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
4fd0: 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  rnal */.int sqli
4fe0: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
4ff0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
5000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  * Number of cach
5010: 65 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f  e pages freed */
5020: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
5030: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
5040: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
5050: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
5060: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
5070: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70  owing variable p
5080: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61  oints to the hea
5090: 64 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69  d of a double-li
50a0: 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  nked list.** of 
50b0: 61 6c 6c 20 70 61 67 65 72 73 20 74 68 61 74 20  all pagers that 
50c0: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
50d0: 20 70 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62   page stealing b
50e0: 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  y the.** sqlite3
50f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
5100: 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63  ) interface.  Ac
5110: 63 65 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73  cess to this lis
5120: 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65  t is.** protecte
5130: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
5140: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5150: 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64  2 mutex..*/.#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5170: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5180: 4e 54 0a 73 74 61 74 69 63 20 50 61 67 65 72 20  NT.static Pager 
5190: 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  *sqlite3PagerLis
51a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61  t = 0;.static Pa
51b0: 67 65 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74  gerLruList sqlit
51c0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20  e3LruPageList = 
51d0: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69  {0, 0, 0};.#endi
51e0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  f.../*.** Journa
51f0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
5200: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
5210: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
5220: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
5230: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
5240: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
5250: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
5260: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
5270: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
5280: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
5290: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
52a0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
52b0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
52c0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
52d0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
52e0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
52f0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
5300: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5310: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5320: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5330: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5340: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5350: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5360: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5370: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
5380: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
5390: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
53a0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
53b0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
53c0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
53d0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
53e0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
53f0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5400: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5410: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5420: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5430: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5440: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5450: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5460: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5470: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
5480: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
5490: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
54a0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
54b0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
54c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
54d0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
54e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
54f0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5500: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5510: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5520: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5530: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5540: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5550: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5560: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5570: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
5580: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
5590: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
55a0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
55b0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
55c0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
55d0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
55e0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
55f0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5600: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5610: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5620: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5630: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5640: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5650: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5660: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5670: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
5680: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
5690: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
56a0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
56b0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
56c0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
56d0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
56e0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
56f0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5700: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5710: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5720: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5730: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5740: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5750: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5760: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5770: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
5780: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
5790: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
57a0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
57b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
57c0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
57d0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
57e0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
57f0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
5800: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5810: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
5820: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
5830: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
5840: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
5850: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
5860: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
5870: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
5880: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
5890: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
58a0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
58b0: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
58c0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
58d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
58e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
58f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
5900: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
5910: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
5920: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
5930: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
5940: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
5950: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
5960: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
5970: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
5980: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
5990: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
59a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
59b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
59c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
59d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
59e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
59f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
5a00: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
5a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5a20: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
5a30: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
5a40: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
5a50: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
5a60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65  ndif../*.** Page
5a70: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
5a80: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
5a90: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
5aa0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
5ab0: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
5ac0: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
5ad0: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
5ae0: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
5af0: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
5b00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
5b10: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
5b20: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
5b30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b40: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
5b50: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
5b60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5b70: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
5b80: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
5b90: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
5ba0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
5bb0: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
5bc0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
5bd0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
5be0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
5bf0: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
5c00: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
5c10: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
5c20: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
5c30: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
5c40: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
5c50: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
5c60: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
5c70: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
5c80: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
5c90: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
5ca0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
5cb0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e  *.** The pagerEn
5cc0: 74 65 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c  ter() and pagerL
5cd0: 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20  eave() routines 
5ce0: 61 63 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65  acquire and rele
5cf0: 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f  ase.** a mutex o
5d00: 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20 20 54  n each pager.  T
5d10: 68 65 20 6d 75 74 65 78 20 69 73 20 72 65 63 75  he mutex is recu
5d20: 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rsive..**.** Thi
5d30: 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70  s is a special-p
5d40: 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49  urpose mutex.  I
5d50: 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20  t only provides 
5d60: 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e  mutual exclusion
5d70: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
5d80: 42 74 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65  Btree and the Me
5d90: 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20  mory Management 
5da0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
5db0: 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63  memory().** func
5dc0: 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e  tion.  It does n
5dd0: 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20  ot prevent, for 
5de0: 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72  example, two Btr
5df0: 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ees from accessi
5e00: 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70  ng.** the same p
5e10: 61 67 65 72 20 61 74 20 74 68 65 20 73 61 6d 65  ager at the same
5e20: 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65   time.  Other ge
5e30: 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  neral-purpose mu
5e40: 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  texes in.** the 
5e50: 62 74 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64  btree layer hand
5e60: 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a  le that chore..*
5e70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5e80: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
5e90: 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69  NAGEMENT.  stati
5ea0: 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65  c void pagerEnte
5eb0: 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  r(Pager *p){.   
5ec0: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a   p->iInUseDB++;.
5ed0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73      if( p->iInUs
5ee0: 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65  eMM && p->iInUse
5ef0: 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e 64 65 66  DB==1 ){.#ifndef
5f00: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
5f10: 4f 50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  OP.      sqlite3
5f20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5f30: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5f40: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5f50: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5f60: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64  ATIC_MEM2);.#end
5f70: 69 66 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55  if.      p->iInU
5f80: 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20 20  seDB = 0;.      
5f90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5fa0: 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
5fb0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5fc0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
5fd0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
5fe0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ex);.    }.    a
5ff0: 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65  ssert( p->iInUse
6000: 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  MM==0 );.  }.  s
6010: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6020: 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29 7b  Leave(Pager *p){
6030: 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42  .    p->iInUseDB
6040: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
6050: 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20 29  p->iInUseDB>=0 )
6060: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ;.  }.#else.# de
6070: 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28  fine pagerEnter(
6080: 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  X).# define page
6090: 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69 66  rLeave(X).#endif
60a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65  ../*.** Add page
60b0: 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64 20   pPg to the end 
60c0: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
60d0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73 74  st managed by st
60e0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74  ructure.** pList
60f0: 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74 68   (pPg becomes th
6100: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
6110: 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20 6d  the list - the m
6120: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
6130: 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e 74   used). Argument
6140: 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f   pLink should po
6150: 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50  int to either pP
6160: 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e  g->free or pPg->
6170: 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64  gfree,.** depend
6180: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 70  ing on whether p
6190: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
61a0: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
61b0: 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c  pecific or.** gl
61c0: 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a  obal LRU list..*
61d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
61e0: 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69  stAdd(PagerLruLi
61f0: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
6200: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
6210: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70  PgHdr *pPg){.  p
6220: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Link->pNext = 0;
6230: 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  .  pLink->pPrev 
6240: 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a  = pList->pLast;.
6250: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6260: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
6270: 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74  AGEMENT.  assert
6280: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72  (pLink==&pPg->fr
6290: 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50  ee || pLink==&pP
62a0: 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73  g->gfree);.  ass
62b0: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
62c0: 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21  >gfree || pList!
62d0: 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  =&sqlite3LruPage
62e0: 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  List);.#endif.. 
62f0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73   if( pList->pLas
6300: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  t ){.    int iOf
6310: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
6320: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
6330: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
6340: 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28  k *pLastLink = (
6350: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
6360: 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70  &((u8 *)pList->p
6370: 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Last)[iOff]);.  
6380: 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65    pLastLink->pNe
6390: 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73  xt = pPg;.  }els
63a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70  e{.    assert(!p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20  List->pFirst);. 
63c0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
63d0: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70   = pPg;.  }..  p
63e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50  List->pLast = pP
63f0: 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74 2d  g;.  if( !pList-
6400: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 26 26  >pFirstSynced &&
6410: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
6420: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
6430: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
6440: 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
6450: 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d   Remove pPg from
6460: 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
6470: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
6480: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
6490: 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72   pList..**.** Ar
64a0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
64b0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
64c0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
64d0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65 70   pPg->gfree, dep
64e0: 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68  ending .** on wh
64f0: 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69  ether pPg is bei
6500: 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
6510: 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f  pager-specific o
6520: 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73  r global LRU lis
6530: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6540: 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61 67  d listRemove(Pag
6550: 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74  erLruList *pList
6560: 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a  , PagerLruLink *
6570: 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50  pLink, PgHdr *pP
6580: 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  g){.  int iOff =
6590: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
65a0: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23   (char *)pPg;..#
65b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
65c0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
65d0: 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70  EMENT.  assert(p
65e0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65  Link==&pPg->free
65f0: 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d   || pLink==&pPg-
6600: 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72  >gfree);.  asser
6610: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67  t(pLink==&pPg->g
6620: 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26  free || pList!=&
6630: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6640: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  st);.#endif..  i
6650: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6660: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c 69  First ){.    pLi
6670: 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69  st->pFirst = pLi
6680: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  nk->pNext;.  }. 
6690: 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d   if( pPg==pList-
66a0: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 4c  >pLast ){.    pL
66b0: 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69  ist->pLast = pLi
66c0: 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  nk->pPrev;.  }. 
66d0: 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65   if( pLink->pPre
66e0: 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72  v ){.    PagerLr
66f0: 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b  uLink *pPrevLink
6700: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
6710: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e   *)(&((u8 *)pLin
6720: 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d 29  k->pPrev)[iOff])
6730: 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d  ;.    pPrevLink-
6740: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6750: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
6760: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b   pLink->pNext ){
6770: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
6780: 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28  k *pNextLink = (
6790: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
67a0: 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70  &((u8 *)pLink->p
67b0: 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Next)[iOff]);.  
67c0: 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72    pNextLink->pPr
67d0: 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  ev = pLink->pPre
67e0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  v;.  }.  if( pPg
67f0: 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53  ==pList->pFirstS
6800: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
6810: 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70  dr *p = pLink->p
6820: 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  Next;.    while(
6830: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
6840: 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  c ){.      Pager
6850: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50  LruLink *pL = (P
6860: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
6870: 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29  ((u8 *)p)[iOff])
6880: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e  ;.      p = pL->
6890: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
68a0: 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79   pList->pFirstSy
68b0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
68c0: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
68d0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30  pLink->pPrev = 0
68e0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20  ;.}../* .** Add 
68f0: 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
6900: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6910: 65 73 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  es for the pager
6920: 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d  . If .** memory-
6930: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6940: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64 20  abled, also add 
6950: 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
6960: 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20  global .** list 
6970: 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a  of free pages..*
6980: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72  /.static void lr
6990: 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20 2a  uListAdd(PgHdr *
69a0: 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64 28  pPg){.  listAdd(
69b0: 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72  &pPg->pPager->lr
69c0: 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70  u, &pPg->free, p
69d0: 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
69e0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
69f0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
6a00: 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  ( !pPg->pPager->
6a10: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
6a20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6a30: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6a40: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6a50: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6a60: 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c      listAdd(&sql
6a70: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6a80: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6a90: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6aa0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6ab0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6ac0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6ad0: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6ae0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6af0: 52 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20  Remove page pPg 
6b00: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
6b10: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6b20: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70  the associated p
6b30: 61 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f  ager..** If memo
6b40: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6b50: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72   enabled, also r
6b60: 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74  emove pPg from t
6b70: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a  he global list.*
6b80: 2a 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e  * of free pages.
6b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ba0: 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67  lruListRemove(Pg
6bb0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6bc0: 74 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50  tRemove(&pPg->pP
6bd0: 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d  ager->lru, &pPg-
6be0: 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66  >free, pPg);.#if
6bf0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6c00: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6c10: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  ENT.  if( !pPg->
6c20: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6c40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6c50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6c60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6c70: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74  _LRU));.    list
6c80: 52 65 6d 6f 76 65 28 26 73 71 6c 69 74 65 33 4c  Remove(&sqlite3L
6c90: 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67  ruPageList, &pPg
6ca0: 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20  ->gfree, pPg);. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6cc0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
6cd0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6ce0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6cf0: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
6d00: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
6d10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6d20: 65 64 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  ed just after th
6d30: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
6d40: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
6d50: 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67  .** from all pag
6d60: 65 73 20 6d 61 6e 61 67 65 64 20 62 79 20 70 50  es managed by pP
6d70: 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20 62 65  ager (usually be
6d80: 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
6d90: 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75  l file.** has ju
6da0: 73 74 20 62 65 65 6e 20 73 79 6e 63 65 64 29 2e  st been synced).
6db0: 20 49 74 20 75 70 64 61 74 65 73 20 74 68 65 20   It updates the 
6dc0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6dd0: 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c  stSynced variabl
6de0: 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d  e.** and, if mem
6df0: 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
6e00: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 73  s enabled, the s
6e10: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6e20: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 0a 2a  t.pFirstSynced.*
6e30: 2a 20 76 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e  * variable also.
6e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6e50: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
6e60: 79 6e 63 65 64 28 50 61 67 65 72 20 2a 70 50 61  ynced(Pager *pPa
6e70: 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ger){.  pPager->
6e80: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6e90: 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70   = pPager->lru.p
6ea0: 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51  First;.#ifdef SQ
6eb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6ec0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6ed0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
6ee0: 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  Db ){.    PgHdr 
6ef0: 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  *p;.    sqlite3_
6f00: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
6f10: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6f20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6f30: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66  TIC_LRU));.    f
6f40: 6f 72 28 70 3d 73 71 6c 69 74 65 33 4c 72 75 50  or(p=sqlite3LruP
6f50: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 20  ageList.pFirst; 
6f60: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
6f70: 3b 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65  ; p=p->gfree.pNe
6f80: 78 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xt);.    assert(
6f90: 70 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  p==pPager->lru.p
6fa0: 46 69 72 73 74 53 79 6e 63 65 64 20 7c 7c 20 70  FirstSynced || p
6fb0: 3d 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  ==sqlite3LruPage
6fc0: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
6fd0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4c  d);.    sqlite3L
6fe0: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6ff0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
7000: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7010: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
7020: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
7030: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
7040: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
7050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7060: 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67  rue if page *pPg
7070: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7080: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
7090: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f   statement.** jo
70a0: 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d  urnal (or statem
70b0: 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73  ent snapshot has
70c0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
70d0: 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a  f *pPg is part.*
70e0: 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  * of an in-memor
70f0: 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  y database)..*/.
7100: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
7110: 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72  nStatement(PgHdr
7120: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
7130: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
7140: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d  Pager;.  if( MEM
7150: 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  DB ){.    return
7160: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7170: 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53  Pg, pPager)->inS
7180: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7190: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
71a0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
71b0: 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
71c0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
71d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
71e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
71f0: 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  r hash table to 
7200: 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20  N.  N must be a 
7210: 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e  power.** of two.
7220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7230: 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
7240: 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70  h_table(Pager *p
7250: 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20  Pager, int N){. 
7260: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20   PgHdr **aHash, 
7270: 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20  *pPg;.  assert( 
7280: 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29  N>0 && (N&(N-1))
7290: 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ==0 );.#ifdef SQ
72a0: 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54  LITE_MALLOC_SOFT
72b0: 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73  _LIMIT.  if( N*s
72c0: 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e  izeof(aHash[0])>
72d0: 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f  SQLITE_MALLOC_SO
72e0: 46 54 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  FT_LIMIT ){.    
72f0: 4e 20 3d 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  N = SQLITE_MALLO
7300: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a  C_SOFT_LIMIT/siz
7310: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20  eof(aHash[0]);. 
7320: 20 7d 0a 20 20 69 66 28 20 4e 3d 3d 70 50 61 67   }.  if( N==pPag
7330: 65 72 2d 3e 6e 48 61 73 68 20 29 20 72 65 74 75  er->nHash ) retu
7340: 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67  rn;.#endif.  pag
7350: 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
7360: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7370: 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69 74 65  Hash!=0 ) sqlite
7380: 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
7390: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
73a0: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
73b0: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
73c0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
73d0: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
73e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
73f0: 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69  >aHash!=0 ) sqli
7400: 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67  te3FaultEndBenig
7410: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
7420: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
7430: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
7440: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
7450: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
7460: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
7470: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
7480: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
7490: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
74a0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
74b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
74c0: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
74d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
74e0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
74f0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
7500: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7510: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7520: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
7530: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
7540: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
7550: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
7560: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
7570: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
7580: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
7590: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
75a0: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
75b0: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
75c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
75d0: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
75e0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
75f0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
7600: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
7610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
7620: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
7630: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
7640: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7650: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
7660: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
7670: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7680: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
7690: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
76a0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
76b0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
76c0: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
76d0: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
76e0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
76f0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7700: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
7710: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
7720: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
7730: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
7740: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
7750: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
7760: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
7770: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
7780: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7790: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
77a0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
77b0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
77c0: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
77d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77e0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
77f0: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
7800: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
7810: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
7820: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
7830: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
7840: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
7850: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
7860: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
7870: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
7880: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
7890: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
78a0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
78b0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
78c0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
78d0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
78e0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
78f0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
7900: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
7910: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7930: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
7940: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
7950: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
7960: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
7970: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
7980: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
7990: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
79a0: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
79b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
79c0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
79d0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
79e0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
79f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
7a00: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
7a10: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
7a20: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
7a30: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
7a40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7a50: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
7a60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7a70: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
7a80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7a90: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
7aa0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7ab0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
7ac0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
7ad0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
7ae0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
7af0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7b00: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
7b10: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
7b20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
7b30: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7b40: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
7b50: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
7b60: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
7b70: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
7b80: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
7b90: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
7ba0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
7bb0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
7bc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
7bd0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
7be0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
7bf0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
7c00: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
7c10: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
7c20: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
7c30: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
7c40: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7c50: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
7c60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7c70: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
7c80: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
7c90: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
7ca0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
7cb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7cc0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
7ce0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
7cf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
7d00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7d10: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
7d20: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
7d30: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
7d40: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
7d50: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
7d60: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
7d70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7d80: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
7d90: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
7da0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
7db0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
7dc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7dd0: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
7de0: 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73  ctor = sqlite3Os
7df0: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
7e00: 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
7e10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
7e20: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
7e30: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
7e40: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
7e50: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7e60: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
7e70: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
7e80: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
7e90: 73 20 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45  s || (dc&(SQLITE
7ea0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e  _IOCAP_ATOMIC|(n
7eb0: 50 61 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74  Page>>8))&&nSect
7ec0: 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20  or<=nPage) ){.  
7ed0: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
7ee0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7ef0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
7f00: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7f10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7f20: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
7f30: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
7f40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
7f50: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
7f60: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
7f70: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
7f80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
7f90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7fa0: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
7fb0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
7fc0: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
7fd0: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
7fe0: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
7ff0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
8000: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8010: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
8020: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8030: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
8040: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
8050: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8060: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
8070: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
8080: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
8090: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
80a0: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
80b0: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
80c0: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
80d0: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
80e0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
80f0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
8100: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
8110: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
8120: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
8130: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
8140: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
8150: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
8160: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
8170: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
8180: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
8190: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
81a0: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
81b0: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
81c0: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
81d0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
81e0: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
81f0: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
8200: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
8210: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
8220: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
8230: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
8240: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
8250: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
8260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8270: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8280: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
8290: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
82a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
82b0: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
82c0: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
82d0: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
82e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
82f0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
8300: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
8310: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
8320: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
8330: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
8340: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
8350: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
8360: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
8370: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
8380: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
8390: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
83a0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
83b0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
83c0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
83d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
83e0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 70  AGER_UNLOCK && p
83f0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
8400: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
8410: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
8420: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
8430: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
8440: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
8450: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
8460: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
8470: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
8480: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
8490: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
84a0: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
84b0: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
84c0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
84f0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8500: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
8510: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
8520: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
8530: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
8540: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
8550: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
8560: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
8570: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
8580: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
8590: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
85a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
85b0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
85c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
85d0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
85e0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
85f0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
8600: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8610: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
8620: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
8630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
8640: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
8650: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
8660: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
8670: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
8680: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
8690: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
86a0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
86b0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
86c0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
86d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
8700: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
8710: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
8720: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
8730: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
8740: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
8750: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
8760: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8770: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
8780: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
8790: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
87a0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
87b0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
87c0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
87d0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
87e0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
87f0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
8800: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
8810: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
8820: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
8830: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
8840: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8850: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8860: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
8870: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
8880: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
8890: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
88a0: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
88b0: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
88c0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
88d0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
88e0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
88f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
8900: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
8910: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
8920: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
8930: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
8940: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8950: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
8960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
8970: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
8980: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
8990: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
89a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
89b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
89c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
89d0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
89e0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
89f0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
8a00: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
8a10: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
8a20: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
8a30: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8a40: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8a50: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8a60: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
8a70: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
8a80: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
8a90: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
8aa0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
8ab0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8ac0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8ad0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ae0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
8af0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
8b00: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
8b10: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
8b20: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
8b30: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8b40: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8b50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8b60: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
8b70: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
8b80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
8b90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8ba0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
8bb0: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
8bc0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8bd0: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8be0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8bf0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8c00: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8c10: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8c20: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8c30: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8c40: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8c50: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8c60: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8c70: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8c80: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8c90: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8ca0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8cb0: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8cc0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8cd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8ce0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8cf0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8d00: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8d10: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8d20: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d30: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8d40: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8d60: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8d70: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8d80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d90: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8da0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8db0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8dc0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8dd0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8de0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8df0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8e00: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8e10: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8e20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8e30: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8e40: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8e50: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8e60: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8e70: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8e80: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8e90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8eb0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8ec0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8ed0: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8ee0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8ef0: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8f00: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8f10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8f30: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8f40: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8f50: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8f60: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8f70: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8f80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8f90: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
8fa0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
8fb0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8fc0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
8fd0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
8fe0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
8ff0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
9000: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
9010: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
9020: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
9030: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
9040: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
9050: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
9060: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
9070: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
9080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9090: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
90a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
90b0: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
90c0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
90d0: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
90e0: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
90f0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
9100: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
9110: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
9120: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
9130: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
9140: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
9150: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
9160: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
9170: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
9180: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
9190: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
9220: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9230: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
9240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9250: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
9260: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9270: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
9280: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
9290: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
92a0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
92b0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
92c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
92d0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
92e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
92f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9300: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
9310: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
9320: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
9330: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
9340: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
9350: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9360: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
9370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9380: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
9390: 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f  ** Write zeros o
93a0: 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f  ver the header o
93b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
93c0: 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  le.  This has th
93d0: 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69  e.** effect of i
93e0: 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
93f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
9400: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a   committing the.
9410: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ** transaction..
9420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
9430: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
9440: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
9450: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
9460: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9470: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
9480: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
9490: 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  8];..  if( pPage
94a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
94b0: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
94c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
94d0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20  lSizeLimit;..   
94e0: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
94f0: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
9500: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
9510: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
9520: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
9530: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
9540: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
9550: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
9560: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9570: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9580: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
9590: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
95a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
95b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
95c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
95d0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
95e0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
95f0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
9600: 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
9610: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
9620: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
9630: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9640: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
9650: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
9660: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
9670: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
9680: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
9690: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
96a0: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
96b0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
96c0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
96d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
96e0: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
96f0: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
9700: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
9710: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
9720: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
9730: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
9740: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
9750: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
9760: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
9770: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
9780: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9790: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
97a0: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
97b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
97c0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
97d0: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
97e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
97f0: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
9800: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
9810: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
9820: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
9830: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
9840: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9850: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9860: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9870: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
9880: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
9890: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
98a0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
98b0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
98c0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
98d0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
98e0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
98f0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
9900: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9910: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
9920: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
9930: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
9940: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
9950: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
9960: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
9970: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
9980: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
9990: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
99a0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
99b0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
99c0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
99d0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
99e0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
99f0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
9a00: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
9a10: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
9a20: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
9a30: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9a40: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
9a50: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
9a60: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
9a70: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
9a80: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
9a90: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
9aa0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
9ab0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
9ac0: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
9ad0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
9ae0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
9af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
9b00: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
9b10: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
9b20: 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20 3d 20    int nHeader = 
9b30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9b40: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a  ;.  int nWrite;.
9b50: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
9b60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9b70: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
9b80: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
9b90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
9ba0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
9bb0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
9bc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
9bd0: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
9be0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9bf0: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
9c00: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
9c10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c20: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
9c30: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
9c40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
9c50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
9c60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9c70: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
9c80: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
9c90: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
9ca0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
9cb0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
9cc0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
9cd0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
9ce0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
9cf0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
9d00: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
9d10: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
9d20: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
9d30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
9d40: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
9d50: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
9d60: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d70: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
9d80: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
9d90: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
9da0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
9db0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
9dc0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
9dd0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
9de0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
9df0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
9e00: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
9e10: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
9e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
9e30: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
9e40: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
9e50: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
9e60: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
9e70: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
9e80: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
9e90: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
9ea0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
9eb0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
9ec0: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
9ed0: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
9ee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
9ef0: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
9f00: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
9f10: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
9f20: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
9f30: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
9f40: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
9f50: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
9f60: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
9f70: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
9f80: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
9f90: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
9fa0: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
9fb0: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
9fc0: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
9fd0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
9fe0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
9ff0: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
a000: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
a010: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
a020: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
a030: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
a040: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
a050: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
a060: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
a070: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
a080: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
a090: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
a0a0: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
a0b0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
a0c0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
a0d0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
a0e0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
a0f0: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
a100: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
a110: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a120: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
a130: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
a140: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
a150: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
a160: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
a170: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
a180: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
a190: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
a1a0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
a1b0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
a1c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
a1d0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
a1e0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
a1f0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
a200: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a210: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
a220: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
a230: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
a240: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
a250: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
a260: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a270: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
a280: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  >dbSize);.  /* T
a290: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a2a0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
a2b0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
a2c0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
a2d0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a2e0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
a2f0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
a300: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a310: 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20  urnalHdr==0 ){. 
a320: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73     /* The page s
a330: 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74 33 32  ize */.    put32
a340: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
a350: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
a360: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
a370: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
a380: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
a390: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
a3a0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
a3b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
a3c0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
a3d0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
a3e0: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
a3f0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
a400: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
a410: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
a420: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a430: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
a440: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
a450: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a460: 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ff);.    pPager-
a470: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
a480: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
a490: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a4a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
a4b0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
a4c0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
a4d0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
a4e0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
a4f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
a500: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
a510: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
a520: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
a530: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
a540: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
a550: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
a560: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
a570: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
a580: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
a590: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
a5a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
a5b0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
a5c0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
a5d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
a5e0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
a5f0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
a600: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
a610: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
a620: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
a630: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
a640: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
a650: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
a660: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
a670: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a680: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
a690: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
a6a0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
a6b0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
a6c0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
a6d0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
a6e0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
a6f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
a700: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
a710: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
a720: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
a730: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
a740: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
a750: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
a760: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
a770: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
a780: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a790: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
a7a0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
a7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
a7c0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
a7d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
a7e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
a7f0: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
a800: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
a810: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
a820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
a830: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
a840: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
a850: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
a860: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b  /.  i64 jrnlOff;
a870: 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69 7a 65  .  int iPageSize
a880: 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  ;..  seekJournal
a890: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
a8a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
a8b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
a8c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
a8d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
a8e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c  DONE;.  }.  jrnl
a900: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
a910: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20  urnalOff;..  rc 
a920: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a930: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
a940: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
a950: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
a960: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a970: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
a980: 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  = sizeof(aMagic)
a990: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
a9a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
a9b0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
a9c0: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
a9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
a9e0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
a9f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
aa00: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
aa10: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
aa20: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
aa30: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
aa40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
aa50: 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67  jrnlOff+4, &pPag
aa60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
aa70: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
aa80: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
aa90: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
aaa0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c  >jfd, jrnlOff+8,
aab0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
aac0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
aad0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
aae0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
aaf0: 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28 75 33   jrnlOff+16, (u3
ab00: 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65 29 3b  2 *)&iPageSize);
ab10: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ab20: 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50 61 67  E_OK .   && iPag
ab30: 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20 20 26  eSize>=512 .   &
ab40: 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53 51 4c  & iPageSize<=SQL
ab50: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ab60: 45 20 0a 20 20 20 26 26 20 28 28 69 50 61 67 65  E .   && ((iPage
ab70: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ab80: 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  e)==0 .  ){.    
ab90: 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 69  u16 pagesize = i
aba0: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
abb0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
abc0: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
abd0: 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a 20  r, &pagesize);. 
abe0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72 65   }.  if( rc ) re
abf0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
ac00: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
ac10: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
ac20: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ac30: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
ac40: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
ac50: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
ac60: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
ac70: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
ac80: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
ac90: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
aca0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
acb0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
acc0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
acd0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
ace0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
acf0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
ad00: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
ad10: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
ad20: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
ad30: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
ad40: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
ad50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ad60: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28  d, jrnlOff+12, (
ad70: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
ad80: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
ad90: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ada0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
adb0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
adc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
add0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ade0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
adf0: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
ae00: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
ae10: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
ae20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
ae30: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
ae40: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
ae50: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
ae60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ae70: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
ae80: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
ae90: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
aea0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
aeb0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
aec0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
aed0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
aee0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
aef0: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
af00: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
af10: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
af20: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
af30: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
af40: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
af50: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
af60: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
af70: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
af80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
af90: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
afa0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
afb0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
afc0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
afd0: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
afe0: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
aff0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b000: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
b010: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
b020: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
b030: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
b040: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
b050: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
b060: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
b070: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
b080: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
b090: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
b0a0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
b0b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
b0c0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
b0d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
b0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
b0f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
b100: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
b110: 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f   i; .  i64 jrnlO
b120: 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69  ff;.  i64 jrnlSi
b130: 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  ze;.  u32 cksum 
b140: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
b150: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
b160: 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20  Magic)+2*4];..  
b170: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
b180: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
b190: 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r) return SQLITE
b1a0: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
b1b0: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
b1c0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
b1d0: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
b1e0: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
b1f0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
b200: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
b210: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
b220: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
b230: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
b240: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
b250: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
b260: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b270: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
b280: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
b290: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
b2a0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
b2b0: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
b2c0: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
b2d0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
b2e0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
b2f0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
b300: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72  Pager);.  }.  jr
b310: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
b320: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
b330: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b340: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
b350: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
b360: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
b370: 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  rnlOff, PAGER_MJ
b380: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
b390: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b3a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b3b0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b  .  jrnlOff += 4;
b3c0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
b3d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b3e0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
b3f0: 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  n, jrnlOff);.  i
b400: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b410: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b420: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a  jrnlOff += len;.
b430: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
b440: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
b450: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
b460: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
b470: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
b480: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
b490: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
b4a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b4b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b4c0: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
b4d0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b4e0: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a  ), jrnlOff);.  j
b4f0: 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65  rnlOff += 8+size
b500: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b510: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
b520: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
b530: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
b540: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
b550: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
b560: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
b570: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
b580: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
b590: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
b5a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
b5b0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
b5c0: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
b5d0: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
b5e0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
b5f0: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
b600: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
b610: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
b620: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
b630: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
b640: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
b650: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
b660: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
b670: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
b680: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
b690: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
b6a0: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
b6b0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
b6c0: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
b6d0: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
b6e0: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
b6f0: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
b700: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
b710: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
b720: 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49  .  if( (rc==SQLI
b730: 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63  TE_OK).   && (rc
b740: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b750: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b760: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53  , &jrnlSize))==S
b770: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a  QLITE_OK.   && j
b780: 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a  rnlSize>jrnlOff.
b790: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
b7a0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
b7b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
b7c0: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
b7d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b7e0: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
b7f0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
b800: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
b810: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
b820: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
b830: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
b840: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
b850: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
b860: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
b870: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
b880: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b890: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
b8a0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
b8b0: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
b8c0: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
b8d0: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
b8e0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
b8f0: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
b900: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
b910: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
b920: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
b930: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b940: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
b950: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
b960: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
b970: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
b980: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
b990: 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20  er;.  PgHistory 
b9a0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
b9b0: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
b9c0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  er);.  assert( M
b9d0: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
b9e0: 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a  Hist->inStmt ){.
b9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
ba00: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  t->pPrevStmt==0 
ba10: 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  && pHist->pNextS
ba20: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
ba30: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
ba40: 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54  ){.      PGHDR_T
ba50: 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70  O_HIST(pPager->p
ba60: 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70  Stmt, pPager)->p
ba70: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
ba80: 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d      }.    pHist-
ba90: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
baa0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  ger->pStmt;.    
bab0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
bac0: 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e  pPg;.    pHist->
bad0: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
bae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
baf0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
bb00: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
bb10: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
bb20: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
bb30: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
bb40: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
bb50: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
bb60: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
bb70: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
bb80: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
bb90: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
bba0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
bbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bbc0: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
bbd0: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
bbe0: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
bbf0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
bc00: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
bc10: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
bc20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
bc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
bc40: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
bc50: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
bc60: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
bc70: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
bc80: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
bc90: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
bca0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
bcb0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
bcc0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
bcd0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
bce0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
bcf0: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
bd00: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
bd10: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
bd20: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
bd30: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
bd40: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
bd50: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
bd60: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
bd70: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
bd80: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
bd90: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
bda0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
bdb0: 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41  Next){.    IOTRA
bdc0: 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
bdd0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
bde0: 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50  g->pgno));.    P
bdf0: 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
be00: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
be10: 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74  ount);.    pNext
be20: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
be30: 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d  ;.    lruListRem
be40: 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73 71  ove(pPg);.    sq
be50: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e  lite3_free(pPg->
be60: 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  pData);.    sqli
be70: 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
be80: 20 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61 67   }.  assert(pPag
be90: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d  er->lru.pFirst==
bea0: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  0);.  assert(pPa
beb0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
bec0: 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73  ynced==0);.  ass
bed0: 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
bee0: 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61  pLast==0);.  pPa
bef0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
bf00: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
bf10: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 44   0;.  pPager->pD
bf20: 69 72 74 79 20 3d 20 30 3b 0a 20 20 70 50 61 67  irty = 0;.  pPag
bf30: 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20  er->nHash = 0;. 
bf40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
bf50: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
bf60: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
bf70: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  0;.  pPager->aHa
bf80: 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sh = 0;.  pPager
bf90: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nRef = 0;.}../
bfa0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
bfb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
bfc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
bfd0: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
bfe0: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
bff0: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
c000: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
c010: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
c020: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
c030: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
c040: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
c050: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
c060: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
c070: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
c080: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
c090: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
c0a0: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
c0b0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
c0c0: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
c0d0: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
c0e0: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
c0f0: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
c100: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
c110: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
c120: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c130: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
c140: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
c150: 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
c160: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
c170: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
c180: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
c190: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70 50       if( rc ) pP
c1a0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
c1b0: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
c1c0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
c1d0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55       IOTRACE(("U
c1e0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c1f0: 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20  ger))..      /* 
c200: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
c210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c220: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c230: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
c240: 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
c250: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
c260: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
c270: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
c280: 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 64 65  ight.      ** de
c290: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75  lete the file ou
c2a0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
c2b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c2c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
c2d0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
c2e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c2f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c300: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c310: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
c320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c330: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
c340: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c350: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
c360: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
c370: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
c380: 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
c390: 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
c3a0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c3b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
c3c0: 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  nnot be.      **
c3d0: 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
c3e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  at the pager fil
c3f0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  e is unlocked, t
c400: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
c410: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
c420: 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
c430: 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ed and the error
c440: 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65   code safely cle
c450: 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
c460: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
c470: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c480: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c490: 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e  TE_OK ) pPager->
c4a0: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
c4b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67  _OK;.        pag
c4c0: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
c4d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
c4e0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
c4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
c500: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
c510: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20  r->stfd);.      
c520: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c530: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c540: 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
c550: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
c560: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
c570: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
c580: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
c590: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
c5a0: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
c5b0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c5c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c5d0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c5e0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
c5f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
c600: 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
c610: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
c620: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
c630: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
c640: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
c650: 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
c660: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
c670: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
c680: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c690: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
c6a0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
c6b0: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
c6c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c6d0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
c6e0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
c6f0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
c700: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
c710: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c720: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
c730: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
c740: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
c750: 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74  , .** do not att
c760: 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  empt the rollbac
c770: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
c780: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
c790: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
c7a0: 70 29 7b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28  p){.  /* assert(
c7b0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
c7c0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
c7d0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
c7e0: 3b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 65 72  ; */.  if( p->er
c7f0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
c800: 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41   && p->state>=PA
c810: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
c820: 20 20 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74      sqlite3Fault
c830: 42 65 67 69 6e 42 65 6e 69 67 6e 28 2d 31 29 3b  BeginBenign(-1);
c840: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
c850: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
c860: 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74 45 6e    sqlite3FaultEn
c870: 64 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 7d  dBenign(-1);.  }
c880: 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
c890: 70 29 3b 0a 23 69 66 20 30 0a 20 20 61 73 73 65  p);.#if 0.  asse
c8a0: 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c  rt( p->errCode |
c8b0: 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  | !p->journalOpe
c8c0: 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69  n || (p->exclusi
c8d0: 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72  veMode&&!p->jour
c8e0: 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73  nalOff) );.  ass
c8f0: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
c900: 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20  || !p->stmtOpen 
c910: 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d  || p->exclusiveM
c920: 6f 64 65 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ode );.#endif.}.
c930: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c940: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
c950: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
c960: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
c970: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
c980: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
c990: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
c9a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c9b0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
c9c0: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
c9d0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
c9e0: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
c9f0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
ca00: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
ca10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
ca20: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
ca30: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
ca40: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
ca50: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
ca60: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
ca70: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
ca80: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
ca90: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
caa0: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
cab0: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
cac0: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
cad0: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
cae0: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
caf0: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
cb00: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
cb10: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
cb20: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
cb30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
cb40: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
cb50: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
cb60: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
cb70: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
cb80: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
cb90: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
cba0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
cbb0: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
cbc0: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
cbd0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
cbe0: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
cbf0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
cc00: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
cc10: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
cc20: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
cc30: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
cc40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
cc50: 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a  int hasMaster){.
cc60: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
cc70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cc80: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
cc90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
cca0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
ccb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
ccc0: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
ccd0: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
cce0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ccf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
cd00: 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
cd10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
cd20: 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67  tmtOpen && !pPag
cd30: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
cd40: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
cd50: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
cd60: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
cd70: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
cd80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
cd90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
cda0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
cdb0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cdc0: 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
cdd0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cde0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cdf0: 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20  PERSIST.    ){. 
ce00: 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
ce10: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
ce20: 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
ce30: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
ce40: 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
ce50: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ce60: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
ce70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
ce80: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
ce90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
cea0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
ceb0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
cec0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ced0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
cee0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
cf00: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
cf10: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
cf20: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
cf30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cf40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
cf50: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
cf60: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
cf70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cf80: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
cf90: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
cfa0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
cfb0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
cfc0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
cfd0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
cfe0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
cff0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
d000: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
d010: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
d020: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
d030: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d040: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
d050: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
d060: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
d070: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
d080: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
d090: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
d0a0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
d0b0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
d0c0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d0d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d0e0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
d0f0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
d100: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
d110: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
d120: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
d130: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
d140: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
d150: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
d160: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
d170: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
d180: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
d190: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
d1a0: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
d1b0: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
d1c0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
d1d0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
d1e0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
d1f0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d200: 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65  = 0;.  lruListSe
d210: 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
d220: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
d230: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
d240: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
d250: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
d260: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
d270: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
d280: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
d290: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
d2a0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
d2b0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
d2c0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
d2d0: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
d2e0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
d2f0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
d300: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
d310: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
d320: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
d330: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
d340: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
d350: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
d360: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
d370: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
d380: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
d390: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
d3a0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
d3b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
d3c0: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
d3d0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
d3e0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
d3f0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
d400: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
d410: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
d420: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
d430: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
d440: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
d450: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
d460: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d470: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d480: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d490: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
d4a0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d4b0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d4c0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d4d0: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d4e0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d4f0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d500: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d510: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d520: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d530: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d540: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d550: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d560: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d570: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
d580: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
d590: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
d5a0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
d5b0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
d5c0: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
d5d0: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
d5e0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
d5f0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
d600: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
d610: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
d620: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
d630: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
d640: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
d650: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
d660: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
d670: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
d680: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
d690: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d6a0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d6b0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d6c0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d6d0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d6e0: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
d6f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d700: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
d710: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d720: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d730: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d740: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d750: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
d760: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
d770: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
d780: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
d790: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d7a0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
d7b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
d7c0: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
d7d0: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
d7e0: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
d7f0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
d800: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
d810: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
d820: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
d830: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
d840: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
d850: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
d860: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
d870: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
d880: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
d890: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
d8a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
d8b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
d8c0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d8d0: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
d8e0: 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74  pPager, .  sqlit
d8f0: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20  e3_file *jfd,.  
d900: 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e  i64 offset,.  in
d910: 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20  t useCksum.){.  
d920: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
d930: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
d940: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
d950: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
d960: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
d970: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d990: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d9a0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
d9b0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
d9c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
d9d0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
d9e0: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
d9f0: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
da00: 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38   u8 *aData = (u8
da10: 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
da20: 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20  pace;   /* Temp 
da30: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
da40: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43  ge */..  /* useC
da50: 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74  ksum should be t
da60: 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  rue for the main
da70: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c   journal and fal
da80: 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74  se for.  ** stat
da90: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20  ement journals. 
daa0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
dab0: 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  s is always the 
dac0: 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  case.  */.  asse
dad0: 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43  rt( jfd == (useC
dae0: 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a  ksum ? pPager->j
daf0: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66  fd : pPager->stf
db00: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
db10: 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d  aData );..  rc =
db20: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
db30: 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b   offset, &pgno);
db40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
db50: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
db60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
db70: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
db80: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
db90: 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
dba0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dbb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
dbc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
dbd0: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
dbe0: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
dbf0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
dc00: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
dc10: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
dc20: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
dc30: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
dc40: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
dc50: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
dc60: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
dc70: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
dc80: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
dc90: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
dca0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
dcb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
dcc0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
dcd0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
dce0: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
dcf0: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
dd00: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
dd10: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
dd20: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
dd30: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
dd40: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
dd50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dd60: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
dd70: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
dd80: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
dd90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
dda0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
ddb0: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
ddc0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
ddd0: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70  ts(jfd, offset+p
dde0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
ddf0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
de00: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
de10: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
de20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
de30: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
de40: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
de50: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
de60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
de70: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
de80: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
de90: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
dea0: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
deb0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
dec0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
ded0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
dee0: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
def0: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
df00: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
df10: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
df20: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
df30: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
df40: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
df50: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
df60: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
df70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
df80: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
df90: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
dfa0: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
dfb0: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
dfc0: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
dfd0: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
dfe0: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
dff0: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e000: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e010: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e020: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e030: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e040: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e050: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e060: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e070: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e080: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e090: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e0a0: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e0b0: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e0c0: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e0d0: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e0e0: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e0f0: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e100: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e110: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e120: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e130: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e140: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e150: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
e160: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
e170: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
e180: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
e190: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
e1a0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
e1b0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
e1c0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
e1d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
e1e0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
e1f0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
e200: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
e210: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
e220: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
e230: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
e240: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
e250: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
e260: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
e270: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
e280: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
e290: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
e2a0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
e2b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
e2c0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
e2d0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
e2e0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
e2f0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
e300: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
e310: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
e320: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
e330: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
e340: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
e350: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
e360: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
e370: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
e380: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
e390: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
e3a0: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
e3b0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
e3c0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
e3d0: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
e3e0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
e3f0: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
e400: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
e410: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
e420: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
e430: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
e440: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
e450: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
e460: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e470: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
e480: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
e490: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
e4a0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
e4b0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
e4c0: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
e4d0: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
e4e0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
e4f0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
e500: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
e510: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
e520: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
e530: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
e540: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
e550: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
e560: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
e570: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
e580: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
e590: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
e5a0: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
e5b0: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
e5c0: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
e5d0: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
e5e0: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
e5f0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
e600: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
e610: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
e620: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
e630: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
e640: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
e650: 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41  PAGERTRACE4("PLA
e660: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
e670: 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
e690: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
e6a0: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
e6b0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
e6c0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a  eSize, aData));.
e6d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e6e0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e6f0: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
e700: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
e710: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
e720: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
e730: 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20  hods ){.    i64 
e740: 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
e750: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
e760: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
e770: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
e780: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
e790: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e7a0: 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
e7b0: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
e7c0: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
e7d0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
e7e0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
e7f0: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
e800: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
e810: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
e820: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
e830: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
e840: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
e850: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
e860: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
e870: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
e880: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
e890: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
e8a0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
e8b0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
e8c0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
e8d0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
e8e0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
e8f0: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
e900: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
e910: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
e920: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
e930: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
e940: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
e950: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
e960: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
e970: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
e980: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
e990: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
e9a0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
e9b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e9c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
e9d0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
e9e0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
e9f0: 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
ea00: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
ea10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
ea20: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
ea30: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
ea40: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
ea50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
ea60: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
ea70: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
ea80: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
ea90: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
eaa0: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
eab0: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
eac0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
ead0: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
eae0: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
eaf0: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
eb00: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
eb10: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
eb20: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
eb30: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
eb40: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
eb50: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
eb60: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
eb70: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
eb80: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
eb90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
eba0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
ebb0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
ebc0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
ebd0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
ebe0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
ebf0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
ec00: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
ec10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
ec20: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
ec30: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
ec40: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ec50: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
ec60: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
ec70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ec80: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
ec90: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
eca0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
ecb0: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
ecc0: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
ecd0: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
ece0: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
ecf0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
ed00: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
ed10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
ed20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed30: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
ed40: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
ed50: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
ed60: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
ed70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
ed80: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
ed90: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
eda0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
edb0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
edc0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
edd0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
ede0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
edf0: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
ee00: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
ee10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ee20: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
ee30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ee40: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
ee50: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
ee60: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
ee70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
ee80: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
ee90: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
eea0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
eeb0: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
eec0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
eed0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
eee0: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
eef0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
ef00: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
ef10: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
ef20: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
ef30: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
ef40: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
ef50: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
ef60: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
ef70: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
ef80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
ef90: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
efa0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
efb0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
efc0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
efd0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
efe0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
eff0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
f000: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
f010: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
f020: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
f030: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
f040: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
f050: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
f060: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
f070: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
f080: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
f090: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
f0a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f0b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
f0c0: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
f0d0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
f0e0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
f0f0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
f100: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
f110: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f120: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
f130: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
f140: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
f150: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f160: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
f170: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
f180: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
f190: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
f1a0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
f1b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f1c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f1d0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
f1e0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
f1f0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
f200: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
f210: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
f220: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
f230: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
f240: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
f250: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
f260: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
f270: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
f280: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
f290: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
f2a0: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
f2b0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
f2c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
f2d0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
f2e0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
f2f0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
f300: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
f310: 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
f320: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
f330: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
f340: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f350: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
f360: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f370: 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
f380: 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
f390: 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
f3a0: 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
f3b0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
f3c0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
f3d0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
f3e0: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
f3f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f400: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f410: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
f420: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
f430: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
f440: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
f450: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
f460: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
f470: 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
f480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f490: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f4a0: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
f4b0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
f4c0: 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69  exists);.      i
f4d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
f4f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f510: 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
f520: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f530: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
f540: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
f550: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
f560: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
f570: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
f580: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
f590: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f5a0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
f5b0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
f5c0: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
f5d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f5e0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
f5f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
f600: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
f610: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
f620: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
f630: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
f640: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
f650: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f660: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
f670: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
f680: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
f690: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f6b0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f6c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f6d0: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
f6e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
f6f0: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
f700: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
f710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f720: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
f730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f750: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
f760: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
f770: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
f780: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
f790: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
f7a0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
f7b0: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
f7c0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
f7d0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
f7e0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
f7f0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f800: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
f810: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
f820: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
f830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f840: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
f850: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
f860: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
f870: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
f880: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f890: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
f8a0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
f8b0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
f8c0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
f8d0: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
f8e0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
f8f0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
f900: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
f910: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
f920: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
f930: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
f950: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
f960: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
f970: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
f980: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
f990: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
f9a0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
f9b0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f9c0: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
f9d0: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
f9e0: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
f9f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
fa00: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
fa10: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
fa20: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
fa30: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
fa40: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
fa50: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
fa60: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
fa70: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
fa80: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
fa90: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
faa0: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
fab0: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
fac0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
fad0: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
fae0: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
faf0: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
fb00: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
fb10: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
fb20: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
fb30: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
fb40: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
fb50: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
fb60: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
fb70: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
fb80: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
fb90: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
fba0: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
fbb0: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
fbc0: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
fbd0: 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
fbe0: 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74  e zero byte to t
fbf0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
fc00: 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  w.** file instea
fc10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fc20: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
fc30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
fc40: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
fc50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fc60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
fc70: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
fc80: 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d  USIVE && pPager-
fc90: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
fca0: 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
fcb0: 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
fcc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fcd0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
fce0: 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
fcf0: 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
fd00: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fd10: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
fd20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fd30: 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
fd40: 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
fd50: 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
fd60: 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
fd70: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fd80: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
fd90: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
fda0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
fdb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
fdc0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
fdd0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
fde0: 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
fdf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fe00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
fe10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
fe20: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
fe30: 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
fe40: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
fe50: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
fe60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fe70: 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69  Set the sectorSi
fe80: 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ze for the given
fe90: 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pager..**.** Th
fea0: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
feb0: 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67   at least as big
fec0: 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   as the sector s
fed0: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
fee0: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
fef0: 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d  orSize().  The m
ff00: 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69  inimum sector si
ff10: 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74  ze is 512..*/.st
ff20: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
ff30: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
ff40: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
ff50: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
ff60: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
ff70: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
ff80: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
ff90: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
ffa0: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
ffb0: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
ffc0: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
ffd0: 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
ffe0: 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
fff0: 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
10000 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
10010 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
10020 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
10030 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
10040 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10050 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
10060 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
10070 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
10080 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
10090 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b  ectorSize<512 ){
100a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
100b0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
100c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
100d0 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
100e0 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
100f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
10100 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
10110 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
10120 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
10130 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
10140 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
10150 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
10160 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
10170 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
10180 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
10190 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
101a0 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
101b0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
101c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
101d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
101e0 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
101f0 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
10200 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
10210 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
10220 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
10230 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
10240 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
10250 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
10260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
10270 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
10280 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
10290 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
102a0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
102b0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
102c0 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
102d0 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
102e0 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
102f0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
10300 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
10310 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
10320 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
10330 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
10340 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
10350 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
10360 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
10370 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
10380 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
10390 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
103a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
103b0 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
103c0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
103d0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
103e0 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37  age case..**  (7
103f0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
10400 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10410 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10420 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
10430 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
10440 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
10450 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
10460 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
10470 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
10480 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
10490 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73  **  (8)  N bytes
104a0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
104b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
104c0 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
104d0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
104e0 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
104f0 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
10500 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10510 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
10520 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
10530 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
10540 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
10550 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
10560 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
10570 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
10580 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
10590 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
105a0 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f  .**  (9)  Zero o
105b0 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
105c0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
105d0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
105e0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
105f0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
10600 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
10610 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
10620 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
10630 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
10640 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
10650 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
10660 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
10670 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
10680 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   8 items above..
10690 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
106a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
106b0 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
106c0 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 9th item..**.
106d0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
106e0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
106f0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
10700 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
10710 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
10720 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
10730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
10740 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
10750 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
10760 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
10770 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
10780 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10790 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
107a0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
107b0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
107c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
107d0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
107e0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
107f0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
10800 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
10810 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
10820 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
10830 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
10840 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
10850 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
10860 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
10870 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
10880 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
10890 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
108a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
108b0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
108c0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
108d0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
108e0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
108f0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
10900 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
10910 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
10920 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
10930 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
10940 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
10950 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
10960 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
10970 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
10980 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
10990 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
109a0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
109b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
109c0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
109d0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
109e0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
109f0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
10a00 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
10a10 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
10a20 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
10a30 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
10a40 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
10a50 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
10a60 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
10a70 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
10a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10a90 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
10aa0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
10ab0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
10ac0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
10ad0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
10ae0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
10af0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
10b00 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
10b10 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
10b20 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
10b30 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
10b40 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
10b50 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
10b60 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
10b70 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
10b80 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
10b90 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
10ba0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
10bb0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
10bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
10bd0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
10be0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
10bf0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c10 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
10c20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10c30 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
10c40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
10c50 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
10c60 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
10c70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10c80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10c90 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
10ca0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10cc0 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
10cd0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
10ce0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10d10 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
10d20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10d30 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
10d40 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
10d50 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
10d80 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
10d90 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10db0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
10dc0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
10dd0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
10de0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
10df0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
10e00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10e10 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
10e20 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
10e30 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
10e40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
10e50 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
10e60 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
10e70 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
10e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10e90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
10ea0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10eb0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
10ec0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
10ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ee0 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
10ef0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10f00 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
10f10 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
10f20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
10f30 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
10f40 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
10f50 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
10f60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10f70 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
10f80 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
10f90 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
10fa0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
10fb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
10fc0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
10fd0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
10fe0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
10ff0 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  k..  */.  zMaste
11000 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
11010 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
11020 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
11030 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11040 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
11050 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
11060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
11070 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
11080 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
11090 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
110a0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
110b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
110c0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
110d0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
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 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
11100 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
11110 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
11120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11130 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
11140 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
11150 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
11160 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
11170 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
11180 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
11190 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
111a0 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
111b0 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
111c0 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
111d0 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
111e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
111f0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
11200 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
11210 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
11220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11230 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
11240 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
11250 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
11260 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
11270 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
11280 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
11290 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
112a0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
112b0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
112c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
112d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
112e0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
112f0 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
11300 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
11310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11320 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
11330 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
11340 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
11350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
11360 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
11370 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
11380 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
11390 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
113a0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
113b0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
113c0 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
113d0 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
113e0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
113f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
11400 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
11410 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
11420 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
11430 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
11440 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
11450 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
11460 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
11470 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
11480 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
11490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
114a0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
114b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
114c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
114d0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
114e0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
114f0 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
11500 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
11510 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
11520 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
11530 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11540 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
11550 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
11560 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
11570 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
11580 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
11590 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
115a0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
115b0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
115c0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
115d0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
115e0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
115f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
11600 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
11610 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
11620 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
11630 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
11640 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
11650 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
11660 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
11670 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
11680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
11690 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
116a0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
116b0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
116c0 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  2565..    */.   
116d0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
116e0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
116f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11700 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
11710 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
11720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11730 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
11740 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
11750 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
11760 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
11770 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
11780 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
11790 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
117a0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
117b0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
117c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
117d0 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
117e0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
117f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11810 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
11820 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
11830 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11840 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11850 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
11860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11870 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11880 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
118a0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
118b0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
118c0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
118d0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
118e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
118f0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11900 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
11910 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11920 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11930 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11940 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11950 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11990 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
119a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
119b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
119c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
119d0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
119e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
119f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11a00 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
11a10 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11a20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11a30 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
11a40 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
11a50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
11a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11a70 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
11a80 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
11a90 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
11aa0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11ab0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
11ac0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
11ad0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
11ae0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
11af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11b00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
11b10 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
11b20 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
11b30 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69  !='\0');.  }.  i
11b40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11b50 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
11b60 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
11b70 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
11b80 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
11b90 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
11ba0 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
11bb0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
11bc0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
11bd0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11be0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
11bf0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
11c00 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
11c10 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
11c20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
11c30 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11c40 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
11c50 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
11c60 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
11c70 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
11c80 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
11c90 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
11ca0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
11cb0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
11cc0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
11cd0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
11ce0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
11cf0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11d00 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
11d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
11d20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
11d30 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
11d40 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
11d50 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
11d60 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
11d70 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
11d80 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
11d90 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
11da0 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
11db0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
11dc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11dd0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
11de0 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
11df0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
11e00 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
11e10 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
11e20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
11e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
11e40 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
11e50 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
11e60 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
11e70 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11e80 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
11e90 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
11ea0 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
11eb0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11ec0 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
11ed0 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
11ee0 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
11ef0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
11f00 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
11f10 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
11f20 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
11f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
11f50 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
11f60 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
11f70 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
11f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11f90 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
11fa0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11fc0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
11fe0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
11ff0 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74  alOff;..  /* Set
12000 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
12010 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
12020 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
12030 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
12040 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
12050 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
12060 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
12070 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
12080 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
12090 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
120a0 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
120b0 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
120c0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
120d0 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
120e0 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
120f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
12100 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
12110 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
12120 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
12130 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
12140 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
12150 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
12160 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
12170 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
12180 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
12190 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
121a0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
121b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
121c0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
121d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
121e0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
121f0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
12200 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
12210 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
12220 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
12230 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
12240 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
12250 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12260 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d  Open );.  nRec =
12270 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
12280 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
12290 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
122a0 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
122b0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
122c0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
122d0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
122e0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
122f0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
12300 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
12310 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
12320 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
12330 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
12340 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
12350 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
12360 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
12370 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
12380 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
12390 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
123a0 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  = i*(4+pPager->p
123b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
123c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
123d0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
123e0 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
123f0 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20   offset, 0);.   
12400 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12410 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
12420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12430 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
12440 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
12450 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
12460 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
12470 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
12480 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
12490 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
124a0 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
124b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
124c0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
124d0 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
124e0 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
124f0 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
12500 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
12510 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
12520 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
12530 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
12540 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
12550 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
12560 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
12570 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
12580 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
12590 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
125a0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
125b0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
125c0 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
125d0 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
125e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
125f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
12600 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
12610 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
12620 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
12630 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
12640 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
12650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12660 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
12670 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
12680 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
12690 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
126a0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
126b0 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
126c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
126d0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
126e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
126f0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
12700 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
12710 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
12720 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
12730 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
12740 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
12750 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
12760 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
12770 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
12780 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
12790 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
127a0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
127b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
127c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
127d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
127e0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
127f0 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
12800 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
12810 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
12820 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
12830 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
12840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
12850 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12860 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
12870 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
12880 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
12890 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
128a0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
128b0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
128c0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
128d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
128e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
128f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
12900 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
12910 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
12920 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12930 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
12940 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
12950 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
12960 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
12970 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
12980 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
12990 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
129a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
129b0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
129c0 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
129d0 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
129e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
129f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
12a00 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
12a10 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
12a20 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
12a30 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
12a40 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
12a50 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
12a60 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
12a70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
12a80 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
12a90 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
12aa0 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
12ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
12ac0 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
12ad0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
12ae0 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
12af0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
12b00 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
12b10 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
12b20 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
12b30 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
12b40 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
12b50 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
12b60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12b70 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
12b80 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
12b90 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
12ba0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
12bb0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
12bc0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12bd0 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
12be0 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
12bf0 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
12c00 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
12c10 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
12c20 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
12c30 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
12c40 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
12c50 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12c60 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
12c70 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
12c80 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
12c90 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
12ca0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
12cb0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
12cc0 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
12cd0 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
12cf0 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
12d00 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
12d10 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
12d20 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
12d30 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
12d40 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
12d50 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
12d60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
12d70 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
12d80 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
12d90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
12da0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12db0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
12dc0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
12dd0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12de0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12df0 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
12e00 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12e10 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
12e20 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
12e30 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
12e40 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
12e50 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
12e60 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
12e70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12e80 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
12e90 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
12ea0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
12eb0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
12ec0 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
12ed0 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
12ee0 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
12f00 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
12f10 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
12f20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
12f30 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12f40 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
12f50 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
12f60 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
12f70 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
12f80 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
12f90 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12fa0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
12fb0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
12fc0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
12fd0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
12fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12ff0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
13000 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
13010 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
13020 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
13030 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  l, int full_fsyn
13040 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
13050 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
13060 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
13070 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
13080 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
13090 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
130a0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
130b0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
130c0 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c   (full_fsync?SQL
130d0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
130e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
130f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13100 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
13110 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13120 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13130 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
13140 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
13150 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
13160 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
13170 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
13180 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
13190 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
131a0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
131b0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
131c0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
131d0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
131e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
131f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
13200 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
13210 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
13220 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
13230 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
13240 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13250 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
13260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13270 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
13280 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
13290 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
132a0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
132b0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
132c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  e the temporary.
132d0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ** file when it 
132e0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
132f0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
13300 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
13310 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
13320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13330 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
13340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
13350 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
13360 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13370 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
13380 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
13390 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
133a0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
133b0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
133c0 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
133d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
133e0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
133f0 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
13400 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
13410 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
13420 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
13430 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
13440 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13450 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13460 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
13470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
13480 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
13490 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
134a0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
134b0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
134c0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
134d0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
134e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
134f0 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  TE_OK || pFile->
13500 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65  pMethods );.  re
13510 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13520 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
13530 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
13540 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
13550 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
13560 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
13570 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
13580 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
13590 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
135a0 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
135b0 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
135c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
135d0 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
135e0 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
135f0 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
13600 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
13610 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
13620 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
13630 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
13640 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
13650 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
13660 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
13670 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
13680 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
13690 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
136a0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
136b0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
136c0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
136d0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
136e0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
136f0 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
13700 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
13710 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
13720 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
13730 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
13740 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
13750 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
13760 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
13770 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
13780 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13790 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
137a0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
137b0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
137c0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
137d0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
137e0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
137f0 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
13800 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
13810 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
13820 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
13830 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
13850 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
13860 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
13870 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
13880 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
13890 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
138a0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
138b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
138c0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
138d0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
138e0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13900 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
13910 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
13920 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
13930 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
13940 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
13950 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
13960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
13970 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
13980 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
13990 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
139a0 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
139b0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
139c0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
139d0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
139e0 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
139f0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
13a00 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
13a10 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  ;.  int journalF
13a20 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
13a30 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
13a40 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75  s);.  int nDefau
13a50 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f  ltPage = SQLITE_
13a60 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
13a70 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  E;.  char *zPath
13a80 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
13a90 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a  nPathname = 0;..
13aa0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
13ab0 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
13ac0 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
13ad0 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
13ae0 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
13af0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
13b00 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
13b10 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
13b20 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
13b30 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
13b40 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
13b50 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
13b60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
13b70 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
13b80 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
13b90 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
13ba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
13bb0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
13bc0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
13bd0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
13be0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
13bf0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
13c00 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74  ite3_malloc(nPat
13c10 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
13c20 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
13c30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13c40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13c50 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13c60 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
13c70 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13c80 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
13c90 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
13ca0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
13cb0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
13cc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
13cd0 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
13ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
13cf0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13d00 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
13d10 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
13d20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
13d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13d40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13d50 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
13d60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13d70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
13d80 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  thname = strlen(
13d90 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
13da0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
13db0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
13dc0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
13dd0 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
13de0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
13df0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
13e00 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
13e10 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
13e20 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
13e30 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20  FileSize +      
13e40 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
13e50 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75  nal file structu
13e60 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d  re */ .    pVfs-
13e70 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20  >szOsFile * 3 + 
13e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
13e90 69 6e 20 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f  in db and two jo
13ea0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
13eb0 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20      3*nPathname 
13ec0 2b 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20  + 40            
13ed0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
13ee0 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
13ef0 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
13f00 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
13f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
13f20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
13f30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13f40 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28  ;.  }.  pPtr = (
13f50 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  u8 *)&pPager[1];
13f60 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
13f70 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
13f80 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28    pPager->fd = (
13f90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
13fa0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
13fb0 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*0];.  pPager-
13fc0 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >stfd = (sqlite3
13fd0 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13fe0 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a  s->szOsFile*1];.
13ff0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
14000 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
14010 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
14020 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72  ile*2];.  pPager
14030 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
14040 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  har*)&pPtr[pVfs-
14050 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72  >szOsFile*2+jour
14060 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20  nalFileSize];.  
14070 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
14080 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
14090 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
140a0 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
140b0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
140c0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
140d0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
140e0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
140f0 66 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e  fs;.  if( zPathn
14100 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ame ){.    memcp
14110 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
14120 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
14130 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
14140 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14150 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Pathname);.  }..
14160 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
14170 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
14180 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
14190 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
141a0 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
141b0 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70  if( nPathname>(p
141c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
141d0 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e  - sizeof("-journ
141e0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72  al")) ){.      r
141f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
14200 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  PEN;.    }else{.
14210 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
14220 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
14230 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
14240 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
14250 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
14260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14270 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
14280 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  r->vfsFlags, &fo
14290 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f  ut);.      readO
142a0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
142b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
142c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
142d0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
142e0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
142f0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
14300 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a  access,.      **
14310 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
14320 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
14330 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
14340 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  reate the.      
14350 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14360 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
14370 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
14380 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20  aximum of:.     
14390 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
143a0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
143b0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
143c0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
143d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
143e0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
143f0 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20  ize().      **  
14400 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
14410 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
14420 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
14430 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20  omically..      
14440 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
14450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
14460 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14470 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69     int iSectorSi
14480 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
14490 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
144a0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >fd);.        if
144b0 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69  ( nDefaultPage<i
144c0 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  SectorSize ){.  
144d0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
144e0 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Page = iSectorSi
144f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
14500 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14510 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
14520 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
14530 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
14540 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
14550 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
14560 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
14570 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
14580 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
14590 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
145a0 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
145b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
145c0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
145d0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
145e0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
145f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
14600 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
14610 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
14620 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44         for(ii=nD
14630 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d  efaultPage; ii<=
14640 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14650 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
14660 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
14670 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
14680 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
14690 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66  |(ii>>8)) ) nDef
146a0 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20  aultPage = ii;. 
146b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
146c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
146d0 20 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74      if( nDefault
146e0 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Page>SQLITE_MAX_
146f0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
14700 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  E ){.          n
14710 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51  DefaultPage = SQ
14720 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
14730 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
14740 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14750 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
14760 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a  !memDb ){.    /*
14770 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
14780 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
14790 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
147a0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
147b0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
147c0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
147d0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
147e0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
147f0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
14800 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
14810 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
14820 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
14830 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  )..    */ .    t
14840 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
14850 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14860 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14870 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
14880 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
14890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
148a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
148b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
148c0 6f 28 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b  o(nDefaultPage);
148d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
148e0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
148f0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
14900 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
14910 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
14920 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
14930 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
14940 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
14950 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
14960 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
14970 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
14980 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
14990 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
149a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
149b0 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
149c0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
149d0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
149e0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
149f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
14a00 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
14a10 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
14a20 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
14a30 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
14a40 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
14a50 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
14a60 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
14a70 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14a80 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
14a90 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
14aa0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
14ab0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
14ac0 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
14ad0 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
14ae0 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
14af0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
14b00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14b10 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
14b20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
14b30 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14b40 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
14b50 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
14b60 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
14b70 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
14b80 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
14b90 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
14ba0 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
14bb0 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20  rnal[] */.  if( 
14bc0 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
14bd0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
14be0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14bf0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
14c00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
14c10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
14c20 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
14c30 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
14c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14c50 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
14c60 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70  = 0;.  }..  /* p
14c70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14c80 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
14c90 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14ca0 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
14cb0 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
14cc0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
14cd0 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
14ce0 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
14cf0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
14d00 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14d10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
14d20 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
14d30 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
14d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
14d50 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
14d60 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e  er->pageSize = n
14d70 44 65 66 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f  DefaultPage;.  /
14d80 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
14d90 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
14da0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
14db0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
14dc0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
14dd0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
14de0 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
14df0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
14e00 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14e10 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
14e20 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
14e30 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
14e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
14e50 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
14e60 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
14e70 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
14e80 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
14e90 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
14ea0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
14eb0 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
14ec0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
14ed0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
14ee0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
14ef0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
14f00 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
14f10 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
14f20 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
14f30 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
14f40 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
14f50 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
14f60 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d  lusiveMode = tem
14f70 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
14f80 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
14f90 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
14fa0 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
14fb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
14fc0 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
14fd0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
14fe0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
14ff0 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
15000 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
15010 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
15020 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
15030 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
15040 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
15050 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
15060 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
15070 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
15080 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
15090 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
150a0 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
150b0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
150c0 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
150d0 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70  ENT(nExtra);.  p
150e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
150f0 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
15100 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
15110 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
15120 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
15130 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44  ->pMethods||memD
15140 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  b||tempFile);.  
15150 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
15160 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
15170 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f  pPager);.  }.  /
15180 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
15190 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
151a0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
151b0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
151c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
151d0 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
151e0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66  er = pPager;.#if
151f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15200 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
15210 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69 49  ENT.  pPager->iI
15220 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50  nUseMM = 0;.  pP
15230 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d  ager->iInUseDB =
15240 20 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62   0;.  if( !memDb
15250 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
15260 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20  TE_MUTEX_NOOP.  
15270 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
15280 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  *mutex = sqlite3
15290 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
152a0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
152b0 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  _MEM2);.#endif. 
152c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
152d0 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
152e0 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74     pPager->pNext
152f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
15300 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ist;.    if( sql
15310 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b  ite3PagerList ){
15320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15330 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d  qlite3PagerList-
15340 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20  >pPrev==0 );.   
15350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
15360 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ist->pPrev = pPa
15370 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ger;.    }.    p
15380 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30  Pager->pPrev = 0
15390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
153a0 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b  erList = pPager;
153b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
153c0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
153d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
153e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
153f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
15400 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
15410 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
15420 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
15430 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
15440 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
15450 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
15460 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
15470 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
15480 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
15490 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
154a0 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
154b0 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
154c0 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
154d0 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
154e0 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
154f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
15500 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
15510 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
15520 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
15530 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
15540 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
15550 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
15560 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
15570 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
15580 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
15590 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
155a0 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
155b0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
155c0 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
155d0 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
155e0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
155f0 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
15600 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
15610 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
15620 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
15630 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
15640 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
15650 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
15660 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
15670 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
15680 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
15690 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
156a0 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
156b0 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
156c0 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
156d0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
156e0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
156f0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
15700 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
15710 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
15720 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
15730 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
15740 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
15750 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
15760 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
15770 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
15780 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
15790 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
157a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
157b0 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
157c0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
157d0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
157e0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
157f0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
15800 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
15810 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15820 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
15830 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
15840 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
15850 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
15860 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
15870 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
15880 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
15890 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
158a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
158b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
158c0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
158d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
158e0 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
158f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15900 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61  ITE_OK;.  u16 pa
15910 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
15920 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
15930 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
15940 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
15950 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
15960 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
15970 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
15980 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
15990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
159a0 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
159b0 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
159c0 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20  >nRef==0 .  ){. 
159d0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
159e0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
159f0 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  malloc(pageSize)
15a00 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20  ;.    if( !pNew 
15a10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15a20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
15a40 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
15a50 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
15a60 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
15a70 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
15a80 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
15a90 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
15aa0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
15ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15ac0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15ad0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
15ae0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
15af0 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65  w;.      pagerLe
15b00 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
15b10 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53   }.  }.  *pPageS
15b20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
15b30 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  geSize;.  return
15b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15b50 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
15b60 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
15b70 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
15b80 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
15b90 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
15ba0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
15bb0 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
15bc0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
15bd0 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
15be0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
15bf0 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
15c00 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
15c10 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
15c20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
15c30 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
15c40 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
15c50 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
15c60 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
15c70 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
15c80 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
15c90 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
15ca0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
15cb0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
15cc0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
15cd0 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
15ce0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
15cf0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15d00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
15d10 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
15d20 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
15d30 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
15d40 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
15d50 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
15d60 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
15d70 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
15d80 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
15d90 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
15da0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
15db0 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
15dc0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
15dd0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
15de0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
15df0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
15e00 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
15e10 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
15e20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
15e30 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
15e40 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
15e50 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
15e60 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
15e70 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
15e80 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
15e90 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
15ea0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
15eb0 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
15ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
15ed0 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
15ee0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
15ef0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
15f00 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
15f10 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
15f20 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
15f30 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
15f40 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
15f50 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
15f60 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
15f70 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
15f80 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
15f90 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
15fa0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
15fb0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
15fc0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
15fd0 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
15fe0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
15ff0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
16000 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
16010 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
16020 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
16030 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
16040 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
16050 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
16060 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
16070 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
16080 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
16090 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
160a0 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
160b0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
160c0 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
160d0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
160e0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
160f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
16100 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
16110 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
16120 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
16130 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
16140 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
16150 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
16160 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
16170 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
16180 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
16190 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
161a0 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
161b0 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
161c0 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
161d0 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
161e0 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
161f0 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
16200 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
16210 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
16220 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
16230 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
16240 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
16250 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
16260 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
16270 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
16280 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
16290 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
162a0 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
162b0 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
162c0 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
162d0 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
162e0 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
162f0 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
16300 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
16310 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
16320 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
16330 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
16340 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
16350 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
16360 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
16370 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
16380 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
16390 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
163a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
163b0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
163c0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
163d0 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
163e0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
163f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16400 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16410 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
16420 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
16430 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
16440 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
16450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
16460 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
16470 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
16480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16490 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
164a0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
164b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
164c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
164d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
164e0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
164f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
16500 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
16510 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
16520 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
16530 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
16540 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
16550 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
16560 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
16570 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
16580 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
16590 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
165a0 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
165b0 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
165c0 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
165d0 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
165e0 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
165f0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
16600 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
16610 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
16620 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
16630 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
16640 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
16650 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
16660 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
16670 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
16680 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
16690 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
166a0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
166b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
166c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
166d0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
166e0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
166f0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
16700 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
16710 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
16720 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
16730 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
16740 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
16750 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
16760 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
16770 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
16780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16790 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
167a0 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72  f++;.      pager
167b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
167c0 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
167d0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
167e0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
167f0 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
16800 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
16810 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
16820 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
16830 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
16840 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
16850 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16860 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
16870 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
16880 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
16890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
168a0 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
168b0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
168c0 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
168d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
168e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
168f0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
16900 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
16910 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
16920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
16930 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
16940 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
16950 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
16960 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
16970 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
16980 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st){.  sqlite3_f
16990 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
169a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
169b0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
169c0 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
169d0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
169e0 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
169f0 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
16a00 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
16a10 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
16a20 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
16a30 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
16a40 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
16a50 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
16a60 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
16a70 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
16a80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
16a90 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
16aa0 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
16ab0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
16ac0 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
16ad0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
16ae0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
16af0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16b00 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
16b10 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
16b20 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
16b30 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
16b40 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
16b50 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
16b60 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
16b70 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
16b80 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
16b90 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
16ba0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
16bb0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
16bc0 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
16bd0 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
16be0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
16bf0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16c00 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
16c10 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
16c20 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16c30 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
16c40 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
16c50 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
16c60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16c70 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
16c80 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
16c90 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
16ca0 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
16cb0 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
16cc0 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
16cd0 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
16ce0 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
16cf0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
16d00 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
16d10 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
16d20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
16d30 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
16d40 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
16d50 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
16d60 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
16d70 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
16d80 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
16d90 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
16da0 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
16db0 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
16dc0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
16dd0 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
16de0 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
16df0 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
16e00 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
16e10 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
16e20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
16e30 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
16e40 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
16e50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
16e60 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55  >pPager;..  /* U
16e70 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20  nlink from free 
16e80 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c  page list */.  l
16e90 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16ea0 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  );..  /* Unlink 
16eb0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
16ec0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
16ed0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
16ee0 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
16ef0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16f00 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
16f10 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
16f20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
16f30 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
16f40 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
16f50 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
16f60 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
16f70 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
16f80 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
16f90 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
16fa0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
16fb0 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
16fc0 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
16fd0 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
16fe0 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
16ff0 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
17000 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17010 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
17020 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
17030 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
17040 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
17050 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
17060 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
17070 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
17080 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
17090 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
170a0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
170b0 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
170c0 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
170d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
170e0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
170f0 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
17100 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
17110 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
17120 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
17130 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
17140 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
17150 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
17160 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
17170 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
17180 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
17190 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
171a0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
171b0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
171c0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
171d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
171e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
171f0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
17200 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
17210 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
17220 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
17230 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
17240 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
17250 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
17260 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
17270 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
17280 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
17290 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
172a0 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
172b0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
172c0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
172d0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
172e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
172f0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
17300 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17310 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
17320 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
17330 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17340 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
17350 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
17360 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
17370 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
17380 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
17390 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
173a0 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
173b0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
173c0 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
173d0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
173e0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
173f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
17400 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
17410 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
17420 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
17430 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
17440 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
17450 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
17460 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
17470 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
17480 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
17490 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
174a0 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
174b0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
174c0 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
174d0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
174e0 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
174f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
17500 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
17510 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
17520 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
17530 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
17540 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
17550 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
17560 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
17570 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
17580 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
17590 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
175a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
175b0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
175c0 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
175d0 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
175e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
175f0 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
17600 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
17610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
17620 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
17630 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
17640 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  ) pPager->pBusyH
17650 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20 3d 20  andler->nBusy = 
17660 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  0;.    do {.    
17670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17680 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
17690 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
176a0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
176b0 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
176c0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
176d0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
176e0 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
176f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
17710 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
17720 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
17730 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
17740 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
17750 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
17760 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17770 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
17780 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
17790 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
177a0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
177b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
177c0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
177d0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
177e0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
177f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17800 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
17810 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
17820 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17830 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
17840 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
17850 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
17860 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17870 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
17880 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
17890 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
178a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
178b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
178c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
178d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
178e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
178f0 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
17900 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
17910 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
17920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17930 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
17940 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 79  ager);.  rc = sy
17950 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
17960 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
17970 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
17980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
179a0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
179b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
179c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
179d0 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
179e0 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e 74 65  . */.  pagerEnte
179f0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
17a00 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
17a10 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
17a20 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
17a30 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
17a40 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17a60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17a70 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
17a80 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
17a90 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
17aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
17ab0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
17ac0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
17ad0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
17ae0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
17af0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
17b00 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
17b10 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
17b20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
17b30 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
17b40 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
17b50 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
17b60 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
17b70 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
17b80 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
17b90 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
17ba0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
17bb0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
17bc0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
17bd0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
17be0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17bf0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
17c00 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
17c10 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
17c20 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
17c30 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
17c40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
17c50 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
17c60 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
17c70 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
17c80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
17c90 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
17ca0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
17cb0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
17cc0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
17cd0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
17ce0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
17cf0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
17d00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17d10 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
17d20 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
17d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
17d40 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
17d50 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 23   if( !MEMDB ){.#
17d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55  ifndef SQLITE_MU
17d70 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c  TEX_NOOP.    sql
17d80 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
17d90 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
17da0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
17db0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
17dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
17dd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17de0 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  r(mutex);.    if
17df0 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20  ( pPager->pPrev 
17e00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17e10 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
17e20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
17e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17e40 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
17e50 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
17e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17e70 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b  pPager->pNext ){
17e80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17e90 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
17ea0 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  ager->pPrev;.   
17eb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
17ec0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
17ed0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
17ee0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
17ef0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
17f00 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65    sqlite3FaultBe
17f10 67 69 6e 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20  ginBenign(-1);. 
17f20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17f30 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17f40 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
17f50 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
17f60 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
17f70 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
17f80 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
17f90 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
17fa0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
17fb0 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e  lite3FaultEndBen
17fc0 69 67 6e 28 2d 31 29 3b 0a 20 20 50 41 47 45 52  ign(-1);.  PAGER
17fd0 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
17fe0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17ff0 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
18000 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
18010 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70  pPager)).  if( p
18020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18030 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
18040 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
18050 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
18060 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
18070 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
18080 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
18090 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
180a0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
180b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
180c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
180d0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
180e0 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
180f0 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
18100 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
18110 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
18120 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
18130 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
18140 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
18150 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
18160 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20  .  ** }.  */..  
18170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
18180 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73  ger->aHash);.  s
18190 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
181a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
181b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
181c0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
181d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
181e0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
181f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
18200 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
18210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
18220 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
18230 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
18240 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
18250 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
18260 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72  (DbPage *p){.  r
18270 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
18280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18290 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
182a0 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
182b0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
182c0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
182d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
182e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
182f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
18300 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
18310 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
18320 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
18330 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
18340 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
18350 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
18360 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
18370 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
18380 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
18390 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
183a0 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
183b0 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
183c0 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
183d0 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
183e0 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
183f0 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
18400 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
18410 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
18420 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
18430 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
18440 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
18450 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
18460 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
18470 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
18480 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
18490 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
184a0 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  pPg);.    pPg->p
184b0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
184c0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
184d0 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
184e0 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
184f0 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
18500 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
18510 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
18520 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
18530 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
18540 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
18550 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
18560 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
18570 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
18580 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
18590 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
185a0 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
185b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
185c0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
185d0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
185e0 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
185f0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
18600 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
18610 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
18620 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
18630 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
18640 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
18650 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 61  g->pPager);.  pa
18660 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 70  ge_ref(pPg);.  p
18670 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70  agerLeave(pPg->p
18680 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
18690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
186a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
186b0 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
186c0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
186d0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
186e0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
186f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
18700 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
18710 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
18720 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
18730 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
18740 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
18750 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
18760 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
18770 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
18780 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
18790 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
187a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
187b0 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
187c0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
187d0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
187e0 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
187f0 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
18800 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
18810 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
18820 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
18830 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
18840 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
18850 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
18860 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
18870 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
18880 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
18890 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
188a0 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
188b0 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
188c0 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
188d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
188e0 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
188f0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
18900 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
18910 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18920 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
18930 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
18940 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
18950 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
18960 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
18970 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
18980 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
18990 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
189a0 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
189b0 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
189c0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
189d0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
189e0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
189f0 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
18a00 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
18a10 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
18a20 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63  lure, so no sync
18a30 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
18a40 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
18a50 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73  ENTIAL flag is s
18a60 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69  et for the persi
18a70 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77  stent media on w
18a80 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  hich.** the data
18a90 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20  base is stored, 
18aa0 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73  then OsSync() is
18ab0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   never called on
18ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
18ad0 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  file. In this ca
18ae0 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  se all that is r
18af0 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70  equired is to up
18b00 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
18b10 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f  eld in.** the jo
18b20 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a  urnal header..**
18b30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18b40 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
18b50 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
18b60 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
18b70 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
18b80 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
18b90 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
18ba0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
18bb0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
18bc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18bd0 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
18be0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
18bf0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
18c00 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
18c10 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
18c20 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
18c30 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
18c40 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
18c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
18c60 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
18c70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18c80 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  le ){.      int 
18c90 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
18ca0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
18cb0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
18cc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18ce0 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  pen );..      if
18cf0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
18d00 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
18d10 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
18d20 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
18d30 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
18d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
18d50 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
18d60 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
18d70 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
18d80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
18d90 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
18da0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
18db0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
18dc0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
18dd0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
18de0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
18df0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
18e00 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
18e10 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
18e20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
18e30 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
18e40 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
18e50 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
18e60 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
18e70 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
18e80 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
18e90 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
18ea0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
18eb0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
18ec0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
18ed0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
18ee0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
18ef0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
18f00 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
18f10 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
18f20 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
18f30 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
18f40 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
18f50 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
18f60 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
18f70 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
18f80 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66        i64 jrnlOf
18f90 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  f;.        if( p
18fa0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
18fb0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
18fc0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
18fd0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
18fe0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
18ff0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
19000 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19010 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
19020 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
19030 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
19040 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
19050 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
19060 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
19070 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
19080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
19090 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
190a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
190b0 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
190c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
190d0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
190e0 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
190f0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
19100 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
19110 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
19120 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
19130 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
19140 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
19150 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
19160 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
19170 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19190 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
191a0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
191b0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
191c0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
191d0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
191e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
191f0 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
19200 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
19210 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
19220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19230 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
19240 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
19250 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
19260 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
19270 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
19280 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
19290 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
192a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
192b0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
192c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
192d0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
192e0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
192f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
19300 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
19310 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
19320 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
19330 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
19340 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
19350 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
19360 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
19370 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
19380 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
19390 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
193a0 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72     lruListSetFir
193b0 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
193c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
193d0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
193e0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
193f0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
19400 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
19410 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
19420 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
19430 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
19440 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
19450 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
19460 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
19470 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
19480 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
19490 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
194a0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
194b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
194c0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
194d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
194e0 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
194f0 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
19500 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b  r->lru.pFirst );
19510 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
19520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19530 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
19540 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
19550 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
19560 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
19570 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
19580 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
19590 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
195a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
195b0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
195c0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
195d0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
195e0 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
195f0 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
19600 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
19610 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
19620 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
19630 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
19640 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
19650 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
19660 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
19670 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
19680 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
19690 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
196a0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
196b0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
196c0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
196d0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
196e0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
196f0 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
19700 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
19710 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
19720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
19730 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
19740 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
19750 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
19760 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
19770 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
19780 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
19790 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
197a0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
197b0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
197c0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
197d0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
197e0 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
197f0 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
19800 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
19810 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
19820 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
19830 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
19840 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19850 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
19860 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
19870 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
19880 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
19890 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
198a0 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
198b0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
198c0 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
198d0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
198e0 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
198f0 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
19900 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
19910 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
19920 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
19930 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
19940 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
19950 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
19960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
19970 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
19980 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
19990 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
199a0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
199b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
199c0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
199d0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
199e0 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
199f0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
19a00 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
19a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19a20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
19a30 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
19a40 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
19a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19a60 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
19a70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
19a80 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
19a90 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
19aa0 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
19ab0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
19ac0 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
19ad0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
19ae0 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
19af0 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
19b00 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
19b10 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
19b20 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
19b30 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
19b40 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
19b50 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
19b60 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
19b70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
19b80 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
19b90 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
19ba0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
19bb0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
19bc0 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
19bd0 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
19be0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
19bf0 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
19c00 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
19c10 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
19c20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
19c30 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
19c40 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
19c50 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
19c60 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
19c70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
19c80 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
19c90 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
19ca0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
19cb0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
19cc0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
19cd0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
19ce0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48  r *pPager;.  PgH
19cf0 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  dr *p;.  int rc;
19d00 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
19d10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19d20 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
19d30 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
19d40 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
19d50 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
19d60 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
19d70 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
19d80 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
19d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
19da0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
19db0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
19dc0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
19dd0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
19de0 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
19df0 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
19e00 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
19e10 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
19e20 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
19e30 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
19e40 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
19e50 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
19e60 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
19e70 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
19e80 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
19e90 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
19ea0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
19eb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19ec0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
19ed0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
19ee0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
19ef0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
19f00 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
19f10 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
19f20 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
19f30 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
19f40 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
19f50 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
19f60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
19f70 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
19f80 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
19f90 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
19fa0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
19fb0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
19fc0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
19fd0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
19fe0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
19ff0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1a000 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1a010 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1a020 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1a030 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1a040 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1a050 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1a060 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1a070 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1a080 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1a090 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1a0a0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1a0b0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1a0c0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1a0d0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1a0e0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
1a0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1a110 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
1a120 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
1a130 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1a140 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1a150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1a160 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e  dirty );.    p->
1a170 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
1a180 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
1a190 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1a1a0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1a1b0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1a1c0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
1a1d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
1a1e0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1a1f0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1a200 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
1a210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a220 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
1a230 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
1a240 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
1a250 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
1a260 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a270 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a280 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
1a290 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
1a2a0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
1a2b0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1a2c0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
1a2d0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
1a2e0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
1a2f0 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
1a300 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
1a310 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
1a320 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
1a330 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
1a340 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
1a350 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
1a360 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
1a370 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
1a380 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
1a390 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1a3a0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1a3b0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c  i64 offset = (pL
1a3c0 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
1a3d0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1a3e0 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ze;.      char *
1a3f0 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
1a400 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
1a410 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
1a420 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
1a430 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1a440 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
1a450 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1a460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a470 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1a480 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
1a490 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1a4a0 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20  (pList));.      
1a4b0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
1a4c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1a4d0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b  , pList->pgno));
1a4e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a4f0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1a500 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
1a510 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1a520 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50  offset);.      P
1a530 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1a540 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
1a550 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
1a560 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1a570 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  >nWrite);.      
1a580 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1a590 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1a5a0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1a5b0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1a5c0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1a5d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1a5e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a5f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a600 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1a610 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53  PAGERTRACE3("NOS
1a620 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
1a630 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1a640 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
1a650 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1a660 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1a670 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53  urn rc;.#ifdef S
1a680 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1a690 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
1a6a0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1a6b0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
1a6c0 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
1a6d0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1a6e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1a6f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a700 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
1a710 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
1a720 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
1a730 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
1a740 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
1a750 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
1a760 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
1a770 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
1a780 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
1a790 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
1a7a0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
1a7b0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
1a7c0 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
1a7d0 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  er){..#ifndef ND
1a7e0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
1a7f0 20 74 68 65 20 73 61 6e 69 74 79 20 6f 66 20 74   the sanity of t
1a800 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 77 68  he dirty list wh
1a810 65 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  en we are runnin
1a820 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62 75 67 67  g.  ** in debugg
1a830 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68 69 73 20  ing mode.  This 
1a840 69 73 20 65 78 70 65 6e 73 69 76 65 2c 20 73 6f  is expensive, so
1a850 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20   do not.  ** do 
1a860 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c  this on a normal
1a870 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74   build. */.  int
1a880 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e   n1 = 0;.  int n
1a890 32 20 3d 20 30 3b 0a 20 20 50 67 48 64 72 20 2a  2 = 0;.  PgHdr *
1a8a0 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  p;.  for(p=pPage
1a8b0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1a8c0 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69 66 28 20  >pNextAll){ if( 
1a8d0 70 2d 3e 64 69 72 74 79 20 29 20 6e 31 2b 2b 3b  p->dirty ) n1++;
1a8e0 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65   }.  for(p=pPage
1a8f0 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b 20 70 3d  r->pDirty; p; p=
1a900 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e 32 2b 2b  p->pDirty){ n2++
1a910 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 31  ; }.  assert( n1
1a920 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ==n2 );.#endif..
1a930 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1a940 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pDirty;.}../*.*
1a950 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
1a960 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
1a970 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
1a980 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
1a990 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
1a9a0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1a9b0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
1a9c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
1a9d0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
1a9e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a9f0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
1aa00 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
1aa10 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
1aa20 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
1aa30 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
1aa40 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
1aa50 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
1aa60 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
1aa70 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1aa80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
1aa90 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62 6c  egative if unabl
1aaa0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1aab0 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65  he status of the
1aac0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1aad0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1aae0 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a  s not open the j
1aaf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
1ab00 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f  xamine its.** co
1ab10 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74  ntent.  Hence, t
1ab20 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1ab30 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d   contain the nam
1ab40 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a  e of a master.**
1ab50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ab60 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  at has been dele
1ab70 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e  ted, and hence n
1ab80 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a  ot be hot.  Or.*
1ab90 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
1aba0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1abb0 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e  t be zeroed out.
1abc0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1abd0 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f  * does not disco
1abe0 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20  ver these cases 
1abf0 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  of a non-hot jou
1ac00 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a  rnal - if the.**
1ac10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
1ac20 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
1ac30 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69  empty this routi
1ac40 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a  ne assumes it.**
1ac50 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61   is hot.  The pa
1ac60 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
1ac70 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
1ac80 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a  over that the.**
1ac90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1aca0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
1acb0 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a  and will no-op..
1acc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1acd0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
1ace0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
1acf0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1ad00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1ad10 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
1ad20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
1ad30 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50 61 67 65  Journal && pPage
1ad40 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1ad50 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1ad60 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
1ad70 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 0a 0a     int locked;..
1ad80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad90 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
1ada0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1adb0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1adc0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
1add0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ade0 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
1adf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ae00 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
1ae10 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
1ae20 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
1ae30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1ae40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ae50 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63 6b 65  exists && !locke
1ae60 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  d ){.      if( s
1ae70 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ae80 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
1ae90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1aea0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1aeb0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1aec0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 65  l, 0);.        e
1aed0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 20  xists = 0;.     
1aee0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65   }.    }..    re
1aef0 73 20 3d 20 28 72 63 21 3d 53 51 4c 49 54 45 5f  s = (rc!=SQLITE_
1af00 4f 4b 20 3f 20 2d 31 20 3a 20 28 65 78 69 73 74  OK ? -1 : (exist
1af10 73 20 26 26 20 21 6c 6f 63 6b 65 64 29 29 3b 0a  s && !locked));.
1af20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
1af30 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  s;.}../*.** Try 
1af40 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1af50 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1af60 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
1af70 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  . .**.** This ro
1af80 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e  utine may return
1af90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
1afa0 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51  QLITE_FULL or SQ
1afb0 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20  LITE_OK. It .** 
1afc0 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65  does not set the
1afd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1afe0 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1aff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
1b000 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50  ecycle(Pager *pP
1b010 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70  ager, PgHdr **pp
1b020 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  Pg){.  PgHdr *pP
1b030 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a  g;.  *ppPg = 0;.
1b040 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65  .  /* It is ille
1b050 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  gal to call this
1b060 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73   function unless
1b070 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
1b080 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74  t.  ** pointed t
1b090 6f 20 62 79 20 70 50 61 67 65 72 20 68 61 73 20  o by pPager has 
1b0a0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65  at least one fre
1b0b0 65 20 70 61 67 65 20 28 70 61 67 65 20 77 69 74  e page (page wit
1b0c0 68 20 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f  h nRef==0)..  */
1b0d0 20 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44   .  assert(!MEMD
1b0e0 42 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  B);.  assert(pPa
1b0f0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29  ger->lru.pFirst)
1b100 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
1b110 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
1b120 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
1b130 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
1b140 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
1b150 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
1b160 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
1b170 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
1b180 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  = pPager->lru.pF
1b190 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f  irstSynced;..  /
1b1a0 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
1b1b0 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
1b1c0 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
1b1d0 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
1b1e0 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
1b1f0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
1b200 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1b210 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
1b220 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
1b230 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
1b240 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
1b250 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
1b260 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61  times.  ** it ca
1b270 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
1b280 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30   */.  if( pPg==0
1b290 20 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e   && pPager->lru.
1b2a0 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 66  pFirst ){.    if
1b2b0 28 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ( !pPager->errCo
1b2c0 64 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  de ){.      int 
1b2d0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1b2e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b2f0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1b300 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1b310 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1b320 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1b330 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
1b340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b350 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
1b360 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1b370 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1b380 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1b390 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1b3a0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
1b3b0 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
1b3c0 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
1b3d0 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  er into the.    
1b3e0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1b3f0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
1b400 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
1b410 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
1b420 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  nal.        ** h
1b430 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
1b440 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
1b450 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
1b460 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
1b470 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
1b480 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1b490 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
1b4a0 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
1b4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 73  .        ** tras
1b4c0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
1b4d0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
1b4e0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ed)..        */.
1b4f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b500 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1b510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
1b530 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1b540 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1b550 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
1b560 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
1b570 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1b580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b590 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1b5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b5c0 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50    }.    pPg = pP
1b5d0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1b5e0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1b5f0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
1b600 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
1b610 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
1b620 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
1b630 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a   is dirty..  */.
1b640 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1b650 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 72 72   && !pPager->err
1b660 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
1b670 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
1b680 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1b690 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   );.    makeClea
1b6a0 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
1b6b0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
1b6c0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1b6d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b6e0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
1b6f0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
1b700 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1b710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b720 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b730 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
1b740 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1b750 72 74 79 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  rty==0 || pPager
1b760 2d 3e 65 72 72 43 6f 64 65 20 29 3b 0a 0a 20 20  ->errCode );..  
1b770 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
1b780 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
1b790 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
1b7a0 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
1b7b0 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67  n.  ** set the g
1b7c0 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
1b7d0 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
1b7e0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
1b7f0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
1b800 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  ontRollback() op
1b810 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
1b820 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
1b830 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
1b840 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
1b850 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
1b860 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
1b870 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
1b880 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
1b890 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
1b8a0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
1b8b0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
1b8c0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
1b8d0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
1b8e0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
1b8f0 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
1b900 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
1b910 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
1b920 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
1b930 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
1b940 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
1b950 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
1b960 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
1b970 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
1b980 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
1b990 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
1b9a0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1b9b0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
1b9c0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
1b9d0 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
1b9e0 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
1b9f0 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
1ba00 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
1ba10 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pPg);.  assert( 
1ba20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a  pPg->pgno==0 );.
1ba30 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
1ba40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ba50 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
1ba60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
1ba70 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a  RY_MANAGEMENT./*
1ba80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ba90 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66  n is called to f
1baa0 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20  ree superfluous 
1bab0 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1bac0 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  cated memory.** 
1bad0 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65  held by the page
1bae0 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79  r system. Memory
1baf0 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53   in use by any S
1bb00 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f  QLite pager allo
1bb10 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
1bb20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d  current thread m
1bb30 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72  ay be sqlite3_fr
1bb40 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52  ee()ed..**.** nR
1bb50 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  eq is the number
1bb60 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
1bb70 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e  ory required. On
1bb80 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73  ce this much has
1bb90 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65  .** been release
1bba0 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  d, the function 
1bbb0 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74  returns. The ret
1bbc0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
1bbd0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
1bbe0 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
1bbf0 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
1bc00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1bc10 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28  erReleaseMemory(
1bc20 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74  int nReq){.  int
1bc30 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 20   nReleased = 0; 
1bc40 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1bc50 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
1bc60 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ased so far */. 
1bc70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc90 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1bca0 20 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73   pagers */.  Bus
1bcb0 79 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42  yHandler *savedB
1bcc0 75 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65  usy;     /* Save
1bcd0 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75  d copy of the bu
1bce0 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  sy handler */.  
1bcf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bd00 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72  OK;..  /* Acquir
1bd10 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e  e the memory-man
1bd20 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20  agement mutex.  
1bd30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1bd40 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73  E_MUTEX_NOOP.  s
1bd50 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1bd60 74 65 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  tex;       /* Th
1bd70 65 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a  e MEM2 mutex */.
1bd80 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
1bd90 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1bda0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1bdb0 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a  C_MEM2);.#endif.
1bdc0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bdd0 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20  enter(mutex);.. 
1bde0 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64   /* Signal all d
1bdf0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be00 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ons that memory 
1be10 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73  management wants
1be20 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63  .  ** to have ac
1be30 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65  cess to the page
1be40 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  rs..  */.  for(p
1be50 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
1be60 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
1be70 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
1be80 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
1be90 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31  er->iInUseMM = 1
1bea0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1beb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bec0 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
1bed0 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20  eased<nReq) ){. 
1bee0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1bef0 20 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63     PgHdr *pRecyc
1bf00 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72  led;. .    /* Tr
1bf10 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
1bf20 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74   to recycle that
1bf30 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1bf40 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20  e a sync(). If. 
1bf50 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f     ** this is no
1bf60 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64  t possible, find
1bf70 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72   one that does r
1bf80 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1bf90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1bfa0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1bfb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1bfc0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1bfd0 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
1bfe0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1bff0 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
1c000 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77 68  stSynced;.    wh
1c010 69 6c 65 28 20 70 50 67 20 26 26 20 28 70 50 67  ile( pPg && (pPg
1c020 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1c030 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1c040 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70 50  eDB) ){.      pP
1c050 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70  g = pPg->gfree.p
1c060 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1c070 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20 20  if( !pPg ){.    
1c080 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c    pPg = sqlite3L
1c090 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
1c0a0 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
1c0b0 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61 67  pPg && pPg->pPag
1c0c0 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a  er->iInUseDB ){.
1c0d0 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
1c0e0 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a  g->gfree.pNext;.
1c0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c100 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c110 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
1c120 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1c130 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
1c140 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  U));..    /* If 
1c150 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  pPg==0, then the
1c160 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61 73   block above has
1c170 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20   failed to find 
1c180 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  a page to.    **
1c190 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68 69   recycle. In thi
1c1a0 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65 61  s case return ea
1c1b0 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65 72  rly - no further
1c1c0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20   memory will.   
1c1d0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
1c1e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c1f0 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20  !pPg ) break;.. 
1c200 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1c210 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73 73  >pPager;.    ass
1c220 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53 79  ert(!pPg->needSy
1c230 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65  nc || pPg==pPage
1c240 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1c250 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1c260 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d  needSync || pPg=
1c270 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
1c280 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20  rstSynced);.  . 
1c290 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20 70     savedBusy = p
1c2a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1c2b0 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ler;.    pPager-
1c2c0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
1c2d0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
1c2e0 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1c2f0 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a 20  , &pRecycled);. 
1c300 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
1c310 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64 42  Handler = savedB
1c320 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  usy;.    assert(
1c330 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c  pRecycled==pPg |
1c340 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc!=SQLITE_OK)
1c350 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c370 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
1c380 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
1c390 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1c3a0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1c3b0 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65  .      ** remove
1c3c0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
1c3d0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
1c3e0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
1c3f0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  -list .      ** 
1c400 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
1c410 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
1c420 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
1c430 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
1c440 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
1c450 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
1c460 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
1c470 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1c480 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
1c490 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
1c4a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
1c4b0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
1c4c0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
1c4d0 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
1c4e0 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  */.      PgHdr *
1c4f0 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  pTmp;.      asse
1c500 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
1c510 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
1c520 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1c530 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1c540 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1c550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c560 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
1c570 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
1c580 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
1c590 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
1c5a0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
1c5b0 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
1c5c0 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
1c5d0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
1c5e0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a   nReleased += (.
1c5f0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1c600 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
1c610 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
1c620 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
1c630 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1c640 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d  ra.          + M
1c650 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
1c660 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b  story) .      );
1c670 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1c680 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
1c690 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1c6a0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
1c6b0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1c6c0 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1c6d0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ount);.      sql
1c6e0 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70  ite3_free(pPg->p
1c6f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
1c700 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
1c710 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
1c720 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65  age--;.    }else
1c730 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72  {.      /* An er
1c740 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
1c750 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
1c760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c770 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  or .      ** jou
1c780 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
1c790 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
1c7a0 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
1c7b0 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
1c7c0 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68   ** caller of th
1c7d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73  is function. Ins
1c7e0 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61  tead, set the Pa
1c7f0 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69  ger.errCode vari
1c800 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
1c810 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
1c820 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1c830 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
1c840 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
1c850 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
1c860 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
1c870 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
1c880 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
1c890 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
1c8a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30  .          (rc&0
1c8c0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
1c8d0 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  RR ||.          
1c8e0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
1c8f0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ||.          rc=
1c900 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
1c910 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1c920 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c930 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1c940 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  D );.      pager
1c950 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1c960 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1c970 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65   /* Clear the me
1c980 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1c990 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73  flags and releas
1c9a0 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f  e the mutex.  */
1c9b0 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1c9c0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1c9d0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1c9e0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1c9f0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1ca00 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  seMM = 0;.  }.  
1ca10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1ca20 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  ave(mutex);..  /
1ca30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ca40 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c  ber of bytes rel
1ca50 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74  eased.  */.  ret
1ca60 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
1ca70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ca80 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1ca90 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
1caa0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1cab0 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
1cac0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1cad0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
1cae0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1caf0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1cb00 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
1cb10 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
1cb20 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
1cb30 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
1cb40 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
1cb50 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
1cb60 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
1cb70 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
1cb80 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1cb90 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
1cba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1cbb0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1cbc0 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
1cbd0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1cbe0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1cbf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1cc00 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
1cc10 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1cc20 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1cc30 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
1cc40 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1cc50 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1cc60 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1cc70 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1cc80 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1cc90 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1cca0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1ccb0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1ccc0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1ccd0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1cce0 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
1ccf0 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
1cd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1cd30 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cd40 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
1cd50 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1cd60 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1cd70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
1cd80 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
1cd90 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
1cda0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1cdb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cdc0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cdd0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
1cde0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1cdf0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1ce00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1ce10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1ce20 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1ce30 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
1ce40 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
1ce50 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
1ce60 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
1ce70 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
1ce80 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
1ce90 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
1cea0 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
1ceb0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1cec0 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
1ced0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
1cee0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1cef0 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
1cf00 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1cf10 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
1cf20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
1cf30 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
1cf40 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
1cf50 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
1cf60 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
1cf70 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
1cf80 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
1cf90 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
1cfa0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1cfb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1cfc0 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f   isHot = 0;..  /
1cfd0 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
1cfe0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  se is opened for
1cff0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
1d000 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  s, has no outsta
1d010 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65  nding .  ** page
1d020 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1d030 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
1d040 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65  tate, now is the
1d050 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
1d060 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
1d070 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
1d080 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
1d090 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
1d0a0 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
1d0b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
1d0c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
1d0d0 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
1d0e0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
1d0f0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1d100 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
1d110 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d120 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1d130 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d140 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20 3d  ){.      isHot =
1d150 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
1d160 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
1d170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
1d180 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1d190 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
1d1a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
1d1b0 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  ill in an error 
1d1c0 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72  state, do not pr
1d1d0 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72  oceed. The error
1d1e0 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c   .  ** state wil
1d1f0 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  l be cleared at 
1d200 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1d210 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c  e future when al
1d220 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66  l page .  ** ref
1d230 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70  erences are drop
1d240 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ped and the cach
1d250 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
1d260 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1d270 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1d280 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1d290 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1d2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
1d2b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1d2c0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
1d2d0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1d2e0 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b  LOCK || isHot ){
1d2f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1d300 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1d310 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
1d320 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
1d330 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1d340 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
1d350 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
1d360 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
1d370 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1d380 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1d390 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
1d3a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d3c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d3d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1d3e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1d3f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d400 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1d410 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1d420 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1d430 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1d440 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1d450 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
1d460 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
1d470 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
1d480 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
1d490 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1d4a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
1d4b0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
1d4c0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
1d4d0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
1d4e0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
1d4f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1d500 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
1d510 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d520 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
1d530 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d540 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1d550 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1d560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d570 69 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69 73 48  if( rc==1 || isH
1d580 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ot ){.        /*
1d590 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
1d5a0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1d5b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
1d5c0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
1d5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
1d5e0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
1d5f0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1d600 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
1d610 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
1d620 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
1d630 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
1d640 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
1d650 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
1d660 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
1d670 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
1d680 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
1d690 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
1d6a0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
1d6b0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1d6c0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
1d6d0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
1d6e0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
1d6f0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
1d700 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
1d710 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1d720 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
1d730 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
1d740 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
1d750 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
1d760 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
1d770 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
1d780 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
1d790 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
1d7a0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
1d7b0 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  * obtain its own
1d7c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1d7d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d7e0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1d7f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1d800 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
1d810 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
1d820 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d830 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1d840 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
1d850 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
1d860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d880 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
1d890 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d8b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
1d8c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1d8d0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1d8e0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1d8f0 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20          }. .    
1d900 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
1d910 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
1d920 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1d930 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
1d940 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
1d950 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1d960 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1d970 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1d980 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1d990 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
1d9a0 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
1d9b0 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
1d9c0 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
1d9d0 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
1d9e0 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
1d9f0 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
1da00 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1da10 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
1da20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
1da30 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
1da40 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
1da50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
1da60 48 6f 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Hot && pPager->j
1da70 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
1da80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
1da90 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  es;.          rc
1daa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1dab0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
1dac0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
1dad0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
1dae0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  es);.          i
1daf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1db10 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1db20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
1db30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1db40 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
1db50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1db60 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
1db70 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
1db80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1db90 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1dba0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
1dbb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dbc0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1dbd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1dbe0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
1dbf0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
1dc00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1dc10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1dc20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1dc30 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
1dc40 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26         if( fout&
1dc50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1dc60 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
1dc70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dc80 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1dc90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dca0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1dcb0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
1dcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dcd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dce0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1dcf0 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
1dd00 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d  ot exist, that m
1dd10 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  eans some other 
1dd20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20  process.        
1dd30 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72        ** has alr
1dd40 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62  eady rolled it b
1dd50 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ack */.         
1dd60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dd70 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1dd80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1dd90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dda0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ddb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ddc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ddd0 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
1dde0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
1ddf0 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  K .           &&
1de00 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1de10 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20  R_NOMEM .       
1de20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1de30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1de40 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
1de50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1de60 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
1de70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1de80 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1de90 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1dea0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1deb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1dec0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ded0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1dee0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1def0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1df00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1df10 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  = 0;. .        /
1df20 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
1df30 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1df40 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
1df50 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
1df60 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
1df70 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
1df80 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
1df90 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1dfa0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1dfb0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
1dfc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dfd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dfe0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
1dff0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1e000 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1e010 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1e020 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1e030 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1e040 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
1e050 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
1e060 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1e070 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
1e080 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
1e090 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
1e0a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1e0b0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
1e0c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1e0d0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
1e0e0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
1e0f0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
1e100 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
1e110 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
1e120 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
1e130 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
1e140 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
1e150 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
1e160 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1e170 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
1e180 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
1e190 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
1e1a0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
1e1b0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1e1c0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
1e1d0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
1e1e0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
1e1f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e200 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
1e210 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
1e220 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
1e230 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
1e240 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1e250 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
1e260 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
1e270 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
1e280 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
1e290 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
1e2a0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
1e2b0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
1e2c0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
1e2d0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
1e2e0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
1e2f0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
1e300 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
1e310 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
1e320 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
1e330 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1e340 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
1e350 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e360 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
1e370 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
1e380 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
1e390 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
1e3a0 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
1e3b0 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
1e3c0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
1e3d0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
1e3e0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
1e3f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e400 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
1e410 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
1e420 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
1e430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1e440 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1e450 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
1e460 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e470 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
1e480 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1e490 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Code;.          
1e4a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e4b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e4c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1e4d0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1e4e0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
1e4f0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
1e500 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
1e510 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
1e520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e530 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1e540 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1e550 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1e560 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1e570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e590 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1e5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e5b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e5c0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1e5d0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1e5e0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1e5f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1e600 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1e610 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e620 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1e630 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1e640 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1e650 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1e660 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1e670 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e690 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1e6a0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1e6b0 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1e6c0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1e6d0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1e6e0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1e6f0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1e700 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1e710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c      }.  }.. fail
1e720 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
1e730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
1e740 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
1e750 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1e760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
1e770 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  nd in-memory dat
1e780 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70  abases. */.    p
1e790 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1e7a0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1e7b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1e7c0 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20  llocate a PgHdr 
1e7d0 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72  object.   Either
1e7e0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1e7f0 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e  e or reuse.** an
1e800 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68   existing one th
1e810 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  at is not otherw
1e820 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ise in use..**.*
1e830 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74  * A new PgHdr st
1e840 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1e850 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
1e860 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a   following are.*
1e870 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * true:.**.**   
1e880 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e    (1)  We have n
1e890 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20  ot exceeded our 
1e8a0 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65  maximum allocate
1e8b0 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  d cache size.** 
1e8c0 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20           as set 
1e8d0 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63  by the "PRAGMA c
1e8e0 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61  ache_size" comma
1e8f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  nd..**.**     (2
1e900 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1e910 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a  unused PgHdr obj
1e920 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61  ects available a
1e930 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a  t this time..**.
1e940 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73  **     (3)  This
1e950 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1e960 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e970 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20       (4)  There 
1e980 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a  are no PgHdr obj
1e990 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ects that do not
1e9a0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1e9b0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  al.**          f
1e9c0 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73  ile sync and a s
1e9d0 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ync of the journ
1e9e0 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  al file is curre
1e9f0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1ea00 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a   prohibited..**.
1ea10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
1ea20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
1ea30 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72  PgHdr.  In other
1ea40 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e   words, reuse an
1ea50 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48  .** existing PgH
1ea60 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  dr if all of the
1ea70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1ea80 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1ea90 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63  1)  We have reac
1eaa0 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20  hed or exceeded 
1eab0 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68  the maximum cach
1eac0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1ead0 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50     allowed by "P
1eae0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1eaf0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  "..**.**     (2)
1eb00 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48    There is a PgH
1eb10 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  dr available wit
1eb20 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30  h PgHdr->nRef==0
1eb30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1eb40 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e  We are not in an
1eb50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1eb60 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  ase.**.**     (4
1eb70 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20  )  Either there 
1eb80 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20  is an available 
1eb90 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20  PgHdr that does 
1eba0 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  not need.**     
1ebb0 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65       to be synce
1ebc0 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73  d to disk or els
1ebd0 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69  e disk syncing i
1ebe0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1ebf0 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e          allowed.
1ec00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ec10 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1ec20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ec30 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
1ec40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ec50 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
1ec60 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48 64  g;.  int nByteHd
1ec70 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  r;..  /* Create 
1ec80 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61  a new PgHdr if a
1ec90 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63  ny of the four c
1eca0 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65  onditions define
1ecb0 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72  d .  ** above ar
1ecc0 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  e met: */.  if( 
1ecd0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1ece0 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1ecf0 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  || pPager->lru.p
1ed00 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
1ed10 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
1ed20 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1ed30 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
1ed40 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
1ed50 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1ed60 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ata;.    if( pPa
1ed70 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1ed80 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1ed90 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1eda0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1edb0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1edc0 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1edd0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1ede0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1edf0 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1ee00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1ee10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ee20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1ee30 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1ee40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ee50 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1ee60 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74  Pager);.    nByt
1ee70 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70  eHdr = sizeof(*p
1ee80 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32  Pg) + sizeof(u32
1ee90 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1eea0 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
1eeb0 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
1eec0 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  PgHistory);.    
1eed0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  pPg = sqlite3_ma
1eee0 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20 29  lloc( nByteHdr )
1eef0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
1ef00 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73  .      pData = s
1ef10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1ef20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ef30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1ef40 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
1ef50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1ef60 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 20  g);.        pPg 
1ef70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1ef80 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65   }.    pagerEnte
1ef90 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1efa0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1efb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1efc0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1efd0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1efe0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
1eff0 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e 42  emset(pPg, 0, nB
1f000 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50 67  yteHdr);.    pPg
1f010 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
1f020 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1f030 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70   = pPager;.    p
1f040 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
1f050 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
1f060 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1f070 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  pPg;.    pPager-
1f080 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73  >nPage++;.  }els
1f090 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
1f0a0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
1f0b0 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
1f0c0 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
1f0d0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
1f0e0 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  cle(pPager, &pPg
1f0f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f100 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1f110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f120 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
1f130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1f140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f150 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1f160 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1f170 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1f180 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1f190 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1f1a0 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
1f1b0 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  }.  *ppPg = pPg;
1f1c0 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  ..pager_allocate
1f1d0 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  _out:.  return r
1f1e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1f1f0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1f200 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1f210 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1f220 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1f230 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1f240 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1f250 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1f260 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1f270 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1f280 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1f290 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1f2a0 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1f2b0 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1f2c0 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1f2d0 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1f2e0 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1f2f0 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1f300 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1f310 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1f320 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1f330 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1f340 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1f350 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20  >needRead ){.   
1f360 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62   int rc = readDb
1f370 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72  Page(pPg->pPager
1f380 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f  , pPg, pPg->pgno
1f390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f3a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f3b0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1f3c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f3d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f3e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f400 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1f410 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1f420 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1f430 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1f440 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1f450 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1f460 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1f470 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1f480 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1f490 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1f4a0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1f4b0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1f4c0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1f4d0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1f4e0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1f4f0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1f500 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1f510 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1f520 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1f530 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1f540 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1f550 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1f560 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1f570 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1f580 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1f590 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1f5a0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1f5b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1f5c0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1f5d0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1f5e0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1f5f0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1f600 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1f610 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1f620 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1f630 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1f640 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1f650 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1f660 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1f670 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1f680 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1f690 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f6a0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1f6b0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1f6c0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1f6d0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1f6e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f6f0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1f700 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f710 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1f720 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1f730 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1f740 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1f750 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1f760 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1f770 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1f780 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1f790 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1f7a0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1f7b0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1f7c0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1f7d0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1f7e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1f7f0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1f800 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1f810 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1f820 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1f830 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1f840 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1f850 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1f860 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1f870 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1f880 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1f890 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1f8a0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1f8b0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1f8c0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1f8d0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1f8e0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1f8f0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1f900 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1f910 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1f920 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1f930 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1f940 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1f950 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1f960 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1f970 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1f980 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1f990 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1f9a0 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1f9b0 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1f9c0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1f9d0 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1f9e0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1f9f0 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1fa00 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1fa10 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1fa20 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1fa30 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1fa40 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1fa50 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1fa60 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1fa70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1fa80 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1fa90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1faa0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1fab0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1fac0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1fad0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1fae0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1faf0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1fb00 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1fb10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1fb20 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1fb30 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1fb40 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1fb50 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1fb60 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1fb70 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1fb80 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1fb90 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1fba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1fbb0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1fbc0 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
1fbd0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1fbe0 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
1fbf0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1fc00 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1fc10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1fc20 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1fc30 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1fc40 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1fc50 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1fc60 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1fc70 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1fc80 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1fc90 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1fca0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1fcb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1fcc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fcd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1fce0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1fcf0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1fd00 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1fd10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fd20 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1fd30 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
1fd40 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fd50 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1fd60 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1fd70 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1fd80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fd90 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1fda0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1fdb0 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1fdc0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1fdd0 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1fde0 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1fdf0 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1fe00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fe10 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1fe20 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1fe30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1fe40 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1fe50 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1fe60 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1fe70 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1fe80 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1fe90 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1fea0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
1feb0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1fec0 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1fed0 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52  int h;.    PAGER
1fee0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
1fef0 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
1ff00 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1ff10 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1ff20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ff30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ff40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ff50 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
1ff60 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72   pgno;.    asser
1ff70 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e  t( !MEMDB || pgn
1ff80 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  o>pPager->stmtSi
1ff90 7a 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  ze );.    pPg->i
1ffa0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1ffb0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1ffc0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1ffd0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d   pgno);.    pPg-
1ffe0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
1fff0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
20000 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65  g);.    pPg->nRe
20010 66 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61 67  f = 1;..    pPag
20020 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
20030 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
20040 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
20050 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
20060 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
20070 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
20080 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
20090 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61  nMax = sqlite3Pa
200a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
200b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
200c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
200d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
200e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
200f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20100 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20120 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  }..    /* Popula
20130 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68  te the page with
20140 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79   data, either by
20150 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
20160 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
20170 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65  * file, or by se
20180 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  tting the entire
20190 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20   page to zero.. 
201a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d     */.    if( nM
201b0 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
201c0 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74  MEMDB || (noCont
201d0 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
201e0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20  alwaysRollback) 
201f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
20200 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
20210 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20220 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
20230 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
20240 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
20250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
20260 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
20270 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
20280 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
20290 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
202a0 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26  ad = noContent &
202b0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
202c0 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  sRollback;.     
202d0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
202e0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
202f0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
20300 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20310 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
20320 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
20330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20340 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
20350 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
20360 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
20370 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
20380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20390 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
203a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
203b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
203c0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
203d0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
203e0 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
203f0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
20400 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
20410 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
20420 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
20430 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
20440 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
20450 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
20460 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
20470 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20480 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
20490 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
204a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
204b0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
204c0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
204d0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
204e0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
204f0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
20500 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
20510 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
20520 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
20530 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
20540 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
20550 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
20560 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
20570 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
20580 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
20590 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
205a0 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50   pgno==1);.    P
205b0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
205c0 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28  ->nHit);.    if(
205d0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
205e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
205f0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
20600 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
20610 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20620 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20630 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28   }.    page_ref(
20640 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
20650 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
20660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20670 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20680 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
20690 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
206a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
206b0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
206c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
206d0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
206e0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
206f0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
20700 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
20710 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
20720 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
20730 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
20740 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
20750 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
20760 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
20770 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
20780 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
20790 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
207a0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
207b0 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
207c0 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
207d0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70   noContent);.  p
207e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
207f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20800 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  }.../*.** Acquir
20810 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
20820 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
20830 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20840 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
20850 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
20860 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
20870 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
20880 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
20890 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
208a0 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
208b0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
208c0 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
208d0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
208e0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
208f0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
20900 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
20910 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
20920 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
20930 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
20940 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
20950 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20960 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
20970 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
20980 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
20990 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
209a0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
209b0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
209c0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
209d0 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
209e0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
209f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20a00 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
20a10 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20  dr *pPg = 0;..  
20a20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
20a30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20a40 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67  gno!=0 );..  pag
20a50 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20a60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20a70 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
20a80 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
20a90 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
20aa0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
20ab0 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65  siveMode );.  }e
20ac0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20ad0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
20ae0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
20af0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f  TE_FULL ){.    /
20b00 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
20b10 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67    }else if( (pPg
20b20 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20b30 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d  pPager, pgno))!=
20b40 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65  0 ){.    page_re
20b50 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  f(pPg);.  }.  pa
20b60 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20b70 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
20b80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
20b90 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
20ba0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20bb0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20bc0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
20bd0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
20be0 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
20bf0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
20c00 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
20c10 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
20c20 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
20c30 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
20c40 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
20c50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20c60 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
20c70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20c80 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
20c90 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
20ca0 2a 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  *pPager;..  if( 
20cb0 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
20cc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
20cd0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20ce0 72 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  r;..  /* Decreme
20cf0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
20d00 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
20d10 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  page.  */.  asse
20d20 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
20d30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
20d40 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
20d50 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20  pPg->nRef--;..  
20d60 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
20d70 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
20d80 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20d90 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
20da0 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
20db0 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
20dc0 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
20dd0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
20de0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
20df0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20  g->nRef==0 ){.. 
20e00 20 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50     lruListAdd(pP
20e10 67 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  g);.    if( pPag
20e20 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
20e30 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
20e40 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
20e50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20e60 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
20e70 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
20e80 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
20e90 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
20ea0 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
20eb0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
20ec0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
20ed0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
20ee0 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
20ef0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
20f00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20f10 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28  er->nRef==0 && (
20f20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
20f30 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
20f40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
20f50 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e  ){.      pagerUn
20f60 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
20f70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
20f80 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
20f90 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
20fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20fb0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
20fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
20fd0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
20fe0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
20ff0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
21000 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
21010 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21020 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
21030 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21040 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
21050 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
21060 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
21070 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
21080 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
21090 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
210a0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
210b0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
210c0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
210d0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
210e0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
210f0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
21100 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
21110 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
21120 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
21130 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21140 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
21150 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
21160 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
21170 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
21180 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21190 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
211a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
211b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
211c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
211d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
211e0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
211f0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
21200 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c  Pager);.  pagerL
21210 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
21220 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21230 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
21240 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
21250 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
21260 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
21280 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
21290 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
212a0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
212b0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
212c0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  urnal;.  }..  if
212d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
212e0 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lOpen==0 ){.    
212f0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
21300 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c  File ){.      fl
21310 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
21320 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21330 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
21340 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
21350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c   }else{.      fl
21360 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
21370 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21380 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
21390 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
213a0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72  OMIC_WRITE.    r
213b0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
213c0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
213d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
213e0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
213f0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
21400 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
21410 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  r).    );.#else.
21420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21430 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
21440 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
21450 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
21460 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
21470 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21480 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
21490 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
214a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
214b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
214c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
214d0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
214e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
214f0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
21500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21520 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
21530 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21540 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
21550 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
21560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21570 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
21580 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
21590 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
215a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
215b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
215c0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
215d0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
215e0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
215f0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
21600 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
21610 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
21620 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21630 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
21640 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
21650 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
21660 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
21670 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
21680 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
21690 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
216a0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
216b0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
216c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
216d0 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
216e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
216f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21700 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
21710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
21720 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
21730 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
21740 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
21750 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
21760 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21770 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21780 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
217a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
217b0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
217c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
217d0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
217e0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
217f0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
21800 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21810 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
21820 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
21830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21840 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
21850 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
21860 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
21870 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
21880 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
21890 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
218a0 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
218b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
218c0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
218d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
218e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
218f0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
21900 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
21910 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
21920 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
21930 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
21940 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
21950 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
21960 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
21970 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
21980 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
21990 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
219a0 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
219b0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
219c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
219d0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
219e0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
219f0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
21a00 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
21a10 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
21a20 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
21a30 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
21a40 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
21a50 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
21a60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21a70 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
21a80 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
21a90 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
21aa0 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
21ab0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
21ac0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
21ad0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
21ae0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21af0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
21b00 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
21b10 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
21b20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
21b30 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
21b40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21b50 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
21b60 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
21b70 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
21b80 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
21b90 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
21ba0 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
21bb0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
21bc0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
21bd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
21be0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
21bf0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
21c00 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
21c10 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
21c20 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
21c30 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
21c40 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
21c50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
21c60 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
21c70 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
21c80 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
21c90 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
21ca0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
21cb0 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
21cc0 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
21cd0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
21ce0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
21cf0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
21d00 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
21d10 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
21d20 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21d30 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
21d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21d50 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
21d60 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
21d70 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
21d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21d90 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
21da0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
21db0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
21dc0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
21dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21de0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
21df0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
21e00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
21e10 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
21e20 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
21e30 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21e40 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21e50 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
21e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21e70 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21e80 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
21e90 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
21ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21eb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21ec0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
21ed0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
21ee0 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
21ef0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
21f00 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
21f10 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
21f20 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
21f30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
21f60 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
21f70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21f80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
21f90 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
21fa0 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
21fb0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
21fc0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
21fd0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
21ff0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
22000 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
22010 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
22020 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
22030 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
22040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
22050 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22060 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
22070 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
22080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
22090 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
220a0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
220b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
220c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
220d0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
220e0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
220f0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
22100 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
22110 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
22120 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
22130 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
22140 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
22150 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
22160 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
22170 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
22180 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
22190 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
221a0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
221b0 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
221c0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
221d0 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
221e0 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
221f0 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
22200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
22210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
22220 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
22230 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
22240 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
22250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22260 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
22270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
22280 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
22290 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
222a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
222b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
222c0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
222d0 76 65 63 43 72 65 61 74 65 28 20 70 50 61 67 65  vecCreate( pPage
222e0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20  r->dbSize );.   
222f0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
22300 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  er);.    if( !pP
22310 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
22320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22330 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
22350 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
22360 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
22370 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  e;.      rc = wr
22380 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
22390 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
223a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
223b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
223c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
223d0 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
223e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
223f0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
22400 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22410 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
22420 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20  age dirty.  Set 
22430 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61  its dirty flag a
22440 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
22450 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c   dirty.** page l
22460 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
22470 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67  oid makeDirty(Pg
22480 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
22490 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
224a0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
224b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
224c0 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  r;.    pPg->dirt
224d0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
224e0 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
224f0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28  >pDirty;.    if(
22500 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
22510 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
22520 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
22530 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rty = pPg;.    }
22540 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44  .    pPg->pPrevD
22550 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
22560 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
22570 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
22580 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65   Make a page cle
22590 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64  an.  Clear its d
225a0 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d  irty bit and rem
225b0 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ove it from the.
225c0 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69  ** dirty page li
225d0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
225e0 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
225f0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
22600 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
22610 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
22620 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
22630 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61  Dirty ){.      a
22640 73 73 65 72 74 28 20 70 50 67 2d 3e 70 44 69 72  ssert( pPg->pDir
22650 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 3d 3d  ty->pPrevDirty==
22660 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
22670 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
22680 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65  irty = pPg->pPre
22690 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  vDirty;.    }.  
226a0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
226b0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61  Dirty ){.      a
226c0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
226d0 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d  vDirty->pDirty==
226e0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
226f0 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
22700 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
22710 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
22720 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22730 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
22740 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
22750 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
22760 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
22770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
22780 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
22790 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
227a0 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
227b0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
227c0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
227d0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
227e0 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
227f0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
22800 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
22810 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
22820 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
22830 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
22840 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22850 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
22860 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
22870 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
22880 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
22890 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
228a0 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
228b0 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
228c0 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
228d0 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
228e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
228f0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
22900 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
22910 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
22920 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
22930 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
22940 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
22950 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
22960 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
22970 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
22980 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
22990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
229a0 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
229b0 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
229c0 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
229d0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
229e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
229f0 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
22a00 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
22a10 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
22a20 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
22a30 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
22a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
22a50 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
22a60 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
22a70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
22a80 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
22a90 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
22aa0 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
22ab0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
22ac0 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
22ad0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
22ae0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
22af0 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a  (pPg);.  Pager *
22b00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
22b10 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
22b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
22b30 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
22b40 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
22b50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
22b60 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
22b70 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22b80 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
22b90 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
22ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
22bb0 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
22bc0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
22bd0 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
22be0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
22bf0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
22c00 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
22c10 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
22c20 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
22c30 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
22c40 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
22c50 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
22c60 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
22c70 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
22c80 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
22c90 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
22ca0 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
22cb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
22cc0 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
22cd0 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
22ce0 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
22cf0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
22d00 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
22d10 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
22d20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
22d30 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
22d40 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
22d50 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
22d60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
22d70 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
22d80 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
22d90 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
22da0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
22db0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
22dc0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
22dd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
22de0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
22df0 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
22e00 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
22e10 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
22e20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
22e30 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
22e40 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
22e50 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69  y..  */.  makeDi
22e60 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
22e70 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
22e80 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & (pageInStateme
22e90 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65  nt(pPg) || pPage
22ea0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
22eb0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22ec0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
22ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
22ee0 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
22ef0 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
22f00 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
22f10 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
22f20 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
22f30 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
22f40 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
22f50 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
22f60 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
22f70 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
22f80 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
22f90 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
22fa0 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
22fb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
22fc0 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
22fd0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
22fe0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
22ff0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
23000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
23010 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
23020 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
23030 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
23040 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
23050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23080 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23090 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
230a0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
230b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
230c0 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
230d0 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  Journal.        
230e0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
230f0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
23100 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
23110 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
23120 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
23130 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23150 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23160 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
23170 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
23180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
23190 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
231a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
231b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
231c0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
231d0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
231e0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
231f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
23200 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
23210 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
23220 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23230 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
23240 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
23250 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
23260 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
23270 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
23280 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
23290 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
232a0 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42 29 20 29  Open || MEMDB) )
232b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
232c0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
232d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
232e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
232f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
23300 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
23310 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
23320 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
23330 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
23340 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
23350 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
23360 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23370 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23390 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
233a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
233b0 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
233c0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
233d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
233e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 48           if( !pH
233f0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
23400 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23430 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
23440 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
23450 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
23460 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23470 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23480 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
23490 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63  sum;.          c
234a0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
234b0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
234c0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
234d0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
234e0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
234f0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
23500 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
23510 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
23520 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
23530 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
23540 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
23550 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
23560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23570 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
23580 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
23590 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
235a0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
235b0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
235c0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
235d0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
235e0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
235f0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
23600 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
23610 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
23620 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
23630 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
23640 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
23650 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23660 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
23680 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
23690 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
236a0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
236d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
236e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
236f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23700 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
23710 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
23720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23730 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23750 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
23760 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
23770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23780 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
23790 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
237a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
237b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
237c0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
237d0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
237e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
237f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23820 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
23830 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
23840 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
23850 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
23860 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
23870 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
23880 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
23890 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
238a0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
238c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
238d0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
238e0 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61  edSync, pager_pa
238f0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20  gehash(pPg));.. 
23900 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
23910 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
23920 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
23930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
23940 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
23950 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
23960 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
23970 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
23980 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
23990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
239a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
239b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
239c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
239d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
239e0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
239f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23a00 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
23a10 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
23a20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
23a30 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
23a40 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
23a50 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  o);.          pP
23a60 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
23a70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
23a80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
23a90 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
23aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23ab0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
23ac0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
23ad0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23af0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
23b00 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
23b10 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
23b20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
23b30 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
23b40 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  c;.        PAGER
23b50 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
23b60 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
23b70 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
23b80 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
23b90 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
23ba0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
23bb0 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
23bc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
23bd0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
23be0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
23bf0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
23c00 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
23c10 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
23c20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
23c30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23c40 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
23c50 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
23c60 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
23c70 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
23c80 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
23c90 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
23ca0 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
23cb0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
23cc0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
23cd0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
23ce0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
23cf0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
23d00 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
23d10 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
23d20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
23d30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
23d40 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
23d50 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49   .     && !pageI
23d60 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
23d70 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50  .     && (int)pP
23d80 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
23d90 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29  >stmtSize .    )
23da0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23db0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
23dc0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
23dd0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
23de0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
23df0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
23e00 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
23e10 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
23e20 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
23e30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23e40 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
23e50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
23e60 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
23e70 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
23e80 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
23e90 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
23ea0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
23eb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
23ec0 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
23ed0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
23ee0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23ef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23f00 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
23f10 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
23f20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
23f30 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
23f40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
23f50 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
23f60 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
23f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f80 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
23f90 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a  Pager->stmtNRec*
23fa0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
23fb0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ize);.        ch
23fc0 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
23fd0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
23fe0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
23ff0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
24000 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
24010 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
24020 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
24030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24060 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
24070 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  stfd, pData2, pP
24080 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
24090 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
240a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
240b0 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
240c0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
240d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
240e0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
240f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
24100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24110 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
24120 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
24130 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
24140 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
24150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24160 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->pInStmt!=0 );
24170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24180 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
24190 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
241a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
241b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
241c0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
241d0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
241e0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
241f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
24200 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
24210 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
24220 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
24230 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
24240 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
24250 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
24260 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
24270 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
24280 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
24290 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
242a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
242b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
242c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
242d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
242e0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
242f0 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
24300 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
24310 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
24320 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
24330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
24340 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
24350 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
24360 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
24370 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
24380 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
24390 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
243a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
243b0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
243c0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
243d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
243e0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
243f0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
24400 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
24410 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
24420 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
24430 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
24440 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
24450 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
24460 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
24470 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24480 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
24490 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
244a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
244b0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
244c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
244d0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
244e0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
244f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
24500 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
24510 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
24520 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
24530 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
24540 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
24550 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
24560 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r);.  if( !MEMDB
24570 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
24580 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
24590 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
245a0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
245b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
245c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
245d0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
24600 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
24610 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
24620 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
24630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24650 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
24660 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
24670 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
24680 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
24690 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
246a0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
246b0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
246c0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
246d0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
246e0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
246f0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
24700 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
24710 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
24720 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
24730 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24740 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
24750 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
24760 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
24770 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
24780 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
24790 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
247a0 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
247b0 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
247c0 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
247d0 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
247e0 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
247f0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
24800 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
24810 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
24820 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
24830 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
24840 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
24850 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
24860 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
24870 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
24880 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61  ount = sqlite3Pa
24890 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
248a0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
248b0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
248c0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
248d0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
248e0 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
248f0 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
24900 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
24910 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
24920 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
24930 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
24940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
24950 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
24960 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
24970 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
24980 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
24990 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
249a0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
249b0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
249c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
249d0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
249e0 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
249f0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
24a00 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
24a10 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
24a20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
24a30 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
24a40 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24a50 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24a60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
24a70 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
24a80 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
24a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24aa0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
24ab0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
24ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24af0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
24b00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24b10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
24b20 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
24b30 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
24b40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
24b50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
24b60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24b70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
24b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
24ba0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
24bb0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
24bc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24bd0 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  if( pPage->needS
24be0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
24bf0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
24c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
24c20 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
24c30 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
24c40 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
24c50 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
24c60 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
24c70 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
24c80 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
24c90 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
24ca0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
24cb0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
24cc0 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
24cd0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
24ce0 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
24cf0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
24d00 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
24d10 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
24d20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
24d30 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
24d40 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
24d50 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
24d60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
24d70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
24d80 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
24d90 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
24da0 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
24db0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
24dc0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
24dd0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
24de0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
24df0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20      if( pPage ) 
24e00 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
24e10 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
24e20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
24e30 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
24e40 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
24e50 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
24e60 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
24e70 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
24e80 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
24e90 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
24ea0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
24eb0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
24ec0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
24ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24ee0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
24ef0 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
24f00 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
24f10 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
24f20 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
24f30 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
24f40 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
24f50 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
24f60 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
24f70 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
24f80 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
24f90 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
24fa0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
24fb0 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
24fc0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
24fd0 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
24fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
24ff0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
25000 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
25010 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
25020 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
25030 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
25040 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
25050 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
25060 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
25070 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
25080 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
25090 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
250a0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
250b0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
250c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
250d0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
250e0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
250f0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
25100 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
25110 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
25120 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
25130 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
25140 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
25150 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
25160 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
25170 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
25180 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
25190 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
251a0 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
251b0 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
251c0 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
251d0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
251e0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
251f0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
25200 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
25210 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
25220 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25230 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
25240 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
25250 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
25260 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25270 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
25280 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
25290 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
252a0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
252b0 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
252c0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
252d0 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
252e0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
252f0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
25300 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
25310 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
25320 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
25330 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
25340 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
25350 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
25360 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
25370 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
25380 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
25390 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
253a0 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
253b0 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
253c0 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
253d0 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
253e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
253f0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
25400 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
25410 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
25420 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25430 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
25440 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
25450 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
25460 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
25470 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
25480 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
25490 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
254a0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
254b0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
254c0 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
254d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
254e0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
254f0 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
25500 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
25510 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25520 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25530 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
25540 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rn;.  pagerEnter
25550 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d  (pPager);.  pPg-
25560 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
25570 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
25580 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
25590 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
255a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
255b0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
255c0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
255d0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
255e0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
255f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
25600 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
25610 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
25620 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
25630 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
25640 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
25650 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
25660 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
25670 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
25680 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
25690 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
256a0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
256b0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
256c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
256d0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
256e0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
256f0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
25700 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
25710 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
25720 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
25730 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
25740 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
25750 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
25760 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
25770 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
25780 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25790 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
257a0 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
257b0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
257c0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
257d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
257e0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
257f0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
25800 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
25810 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
25820 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
25830 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
25840 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
25850 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
25860 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
25870 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
25880 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25890 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
258a0 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
258b0 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
258c0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
258d0 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
258e0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
258f0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
25900 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
25910 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
25920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
25930 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
25940 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
25950 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
25960 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
25970 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
25980 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
25990 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
259a0 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
259b0 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
259c0 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
259d0 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
259e0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
259f0 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
25a00 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  k journal..**.**
25a10 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
25a20 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61  yet actually rea
25a30 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
25a40 20 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a   this page (if.*
25a50 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  * the PgHdr.need
25a60 52 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74  Read flag is set
25a70 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
25a80 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72  ine acts as a pr
25a90 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65  omise.** that we
25aa0 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64   will never need
25ab0 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
25ac0 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  e content in the
25ad0 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74   future..** so t
25ae0 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67  he needRead flag
25af0 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
25b00 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
25b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25b20 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25b30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25b40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25b50 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25b60 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
25b70 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
25b80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
25b90 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
25ba0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
25bb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
25bc0 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69  open, or DontWri
25bd0 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  te() has been ca
25be0 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69  lled on.  ** thi
25bf0 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74  s page (DontWrit
25c00 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77  e() sets the alw
25c10 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
25c20 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  ), then this.  *
25c30 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
25c40 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
25c50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
25c60 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d  lOpen==0 || pPg-
25c70 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
25c80 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
25c90 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
25ca0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25cb0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  er);.    return;
25cc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
25cd0 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46  MEMDB );    /* F
25ce0 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67  or a memdb, pPag
25cf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
25d00 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a  is always 0 */..
25d10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
25d20 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
25d30 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
25d40 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
25d50 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e 6f 72 69  no > pPager->ori
25d60 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
25d70 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
25d80 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
25d90 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
25da0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
25db0 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
25dc0 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
25dd0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
25de0 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
25df0 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
25e00 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
25e10 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
25e20 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
25e30 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
25e40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
25e50 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
25e60 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
25e70 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
25e80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
25e90 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
25ea0 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2f  ust be met..  */
25eb0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
25ec0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
25ed0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
25ee0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25ef0 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ze );..  assert(
25f00 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
25f10 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal!=0 );.  sqli
25f20 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
25f30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
25f40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70   pPg->pgno);.  p
25f50 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
25f60 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  1;.  pPg->needRe
25f70 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ad = 0;.  if( pP
25f80 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
25f90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25fa0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
25fb0 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  >= pPager->origD
25fc0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c  bSize );.    sql
25fd0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
25fe0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
25ff0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
26000 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
26010 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
26020 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
26030 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
26040 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
26050 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
26060 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
26070 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70   pPg->pgno)).  p
26080 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26090 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
260a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
260b0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
260c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
260d0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
260e0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
260f0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
26100 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
26110 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
26120 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
26130 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
26140 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
26150 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
26160 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
26170 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
26180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26190 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
261a0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
261b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
261c0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
261d0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
261e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
261f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
26200 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
26210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26220 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26230 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
26240 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
26250 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26260 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
26270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
26290 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
262a0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
262b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
262c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
262d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
262e0 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
262f0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
26300 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
26310 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
26320 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
26330 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
26340 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
26350 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
26360 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
26370 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
26380 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
26390 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
263a0 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  ounter);..    if
263b0 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
263c0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
263d0 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
263e0 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50  t void *zBuf = P
263f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
26400 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Hdr);.      rc =
26410 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
26420 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
26430 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26440 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ze, 0);.    }.. 
26450 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
26460 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
26470 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
26480 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
26490 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
264a0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
264b0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
264c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
264d0 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69  ync the pager fi
264e0 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  le to disk..*/.i
264f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
26500 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
26510 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
26520 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
26530 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
26540 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26550 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
26560 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70 61 67 65  c_flags);.  page
26570 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26590 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
265a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
265b0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
265c0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
265d0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
265e0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
265f0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
26600 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
26610 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
26620 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
26630 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
26640 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
26650 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
26660 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
26670 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
26680 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
26690 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
266a0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
266b0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
266c0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
266d0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
266e0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
266f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26700 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
26710 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
26720 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
26730 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
26740 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
26750 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
26760 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
26770 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
26780 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
26790 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
267a0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
267b0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
267c0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
267d0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
267e0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
267f0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
26800 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
26810 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
26820 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
26830 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
26840 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
26850 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
26860 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
26870 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
26880 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
26890 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
268a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
268b0 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
268c0 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
268d0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
268e0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
268f0 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
26900 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
26910 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
26920 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
26930 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
26940 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26950 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
26960 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
26970 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
26980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
26990 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
269a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
269b0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
269c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
269d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
269e0 4d 61 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20  Master, .  Pgno 
269f0 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f  nTrunc,.  int no
26a00 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Sync.){.  int rc
26a10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26a20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
26a30 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
26a40 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
26a50 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
26a60 20 6e 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65   no changes have
26a70 20 62 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63   been made, we c
26a80 61 6e 20 6c 65 61 76 65 20 74 68 65 20 74 72 61  an leave the tra
26a90 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a  nsaction early..
26aa0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
26ab0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
26ac0 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61   &&.        (pPa
26ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
26ae0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
26af0 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20  ODE_DELETE ||.  
26b00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26b10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30  exclusiveMode!=0
26b20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
26b30 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
26b40 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
26b50 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
26b60 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
26b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
26b80 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
26b90 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
26ba0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
26bb0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
26bc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
26bd0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
26be0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65   nTrunc);.  page
26bf0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
26c00 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
26c10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
26c20 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
26c30 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
26c40 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
26c50 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
26c60 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
26c70 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
26c80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
26c90 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
26ca0 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d  R_SYNCED && !MEM
26cb0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  DB && pPager->di
26cc0 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
26cd0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66  PgHdr *pPg;..#if
26ce0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
26cf0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
26d00 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63     /* The atomic
26d10 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
26d20 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
26d30 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20  if all of the.  
26d40 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
26d50 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a  re true:.    **.
26d60 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
26d70 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
26d80 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
26d90 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
26da0 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
26db0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
26dc0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20  ge-size, and.   
26dd0 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f   **    + This co
26de0 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  mmit is not part
26df0 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
26e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e   transaction, an
26e10 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78  d.    **    + Ex
26e20 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68  actly one page h
26e30 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
26e40 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68   and store in th
26e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
26e60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
26e70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
26e80 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74  n can be used, t
26e90 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26ea0 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a  file will never.
26eb0 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65      ** be create
26ec0 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
26ed0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  action..    */. 
26ee0 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63     int useAtomic
26ef0 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20  Write = (.      
26f00 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20    !zMaster && . 
26f10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
26f20 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20  ournalOpen &&.  
26f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26f40 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
26f50 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
26f60 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72   && .        nTr
26f70 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20  unc==0 && .     
26f80 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70     (0==pPager->p
26f90 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67  Dirty || 0==pPag
26fa0 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72  er->pDirty->pDir
26fb0 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  ty).    );.    a
26fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
26fd0 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
26fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26ff0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
27000 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20  MODE_OFF );.    
27010 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69  if( useAtomicWri
27020 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  te ){.      /* U
27030 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66  pdate the nRec f
27040 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  ield in the jour
27050 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
27060 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20     int offset = 
27070 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
27080 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
27090 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
270a0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
270b0 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20  >nRec==1);.     
270c0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
270d0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f  s(pPager->jfd, o
270e0 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e  ffset, pPager->n
270f0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Rec);..      /* 
27100 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
27110 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
27120 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
27130 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
27140 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69  y.      ** the i
27150 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
27160 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20  ntation of page 
27170 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  1 to include the
27180 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a   updated.      *
27190 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
271a0 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
271b0 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20  page 1 directly 
271c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
271d0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42        ** file. B
271e0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
271f0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
27200 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
27210 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20  file-system, .  
27220 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73      ** this is s
27230 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  afe..      */.  
27240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27260 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
27270 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
27280 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
27290 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
272a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
272b0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
272c0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
272d0 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41  }..    if( !useA
272e0 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63  tomicWrite && rc
272f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65  ==SQLITE_OK ).#e
27300 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
27310 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
27320 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
27330 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
27340 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
27350 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
27360 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
27370 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
27380 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
27390 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
273a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
273b0 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
273c0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
273d0 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
273e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
273f0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
27400 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
27410 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
27420 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
27430 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
27440 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
27450 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
27460 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
27470 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
27480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
27490 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
274a0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
274b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
274c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
274d0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
274e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
274f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
27500 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
27510 46 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  FF ){.#ifndef SQ
27520 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27530 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
27540 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
27550 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
27560 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
27570 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
27580 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
27590 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
275a0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
275b0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
275c0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
275d0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
275e0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
275f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
27600 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27610 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
27620 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
27630 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
27640 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
27650 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
27660 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
27670 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
27680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
27690 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
276a0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
276b0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
276c0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
276d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
276e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
276f0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
27700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27720 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27730 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
27740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27750 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
27760 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27770 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
27780 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
27790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
277a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
277b0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
277c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20    }.          } 
277d0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
277e0 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  f.        rc = w
277f0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
27800 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
27810 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
27820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27830 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27840 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e          rc = syn
27850 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
27860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27880 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
27890 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
278a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
278b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
278c0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
278d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
278e0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
278f0 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
27900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27910 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
27920 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
27930 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
27940 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
27950 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
27960 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
27970 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
27980 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
27990 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
279a0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
279b0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
279c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
279d0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
279e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
279f0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
27a00 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
27a10 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
27a20 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
27a30 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
27a40 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
27a50 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
27a60 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
27a70 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
27a80 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
27a90 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
27aa0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
27ab0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
27ac0 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
27ad0 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
27ae0 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
27af0 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
27b00 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
27b10 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
27b20 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
27b30 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
27b40 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
27b50 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
27b60 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
27b70 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
27b80 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
27b90 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  xit;.    }.    p
27ba0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27bb0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
27bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27bd0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
27be0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
27bf0 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
27c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27c10 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
27c20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
27c30 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
27c40 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
27c50 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
27c60 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
27c70 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
27c80 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
27c90 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
27ca0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
27cb0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27cc0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
27cd0 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
27ce0 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
27cf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
27d00 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
27d10 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27d20 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
27d30 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
27d40 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
27d50 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
27d60 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
27d70 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
27d80 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
27d90 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
27da0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
27db0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
27dc0 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20  ent, it is.     
27dd0 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
27de0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
27df0 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
27e00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
27e10 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
27e20 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27e30 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
27e40 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
27e50 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
27e60 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
27e70 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
27e80 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
27e90 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
27ea0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
27eb0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
27ec0 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
27ed0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27ee0 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
27ef0 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
27f00 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
27f10 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
27f20 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
27f30 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
27f40 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27f50 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
27f60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
27f70 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
27f80 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
27f90 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
27fa0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
27fb0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
27fc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27fd0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
27fe0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
27ff0 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
28000 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
28010 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
28020 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
28030 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
28040 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
28050 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
28060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28070 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
28080 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
28090 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
280a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
280b0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74  ;.  }.  pagerEnt
280c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41  er(pPager);.  PA
280d0 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
280e0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
280f0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
28100 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
28110 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
28120 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
28130 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
28140 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50  ( pPg ){.      P
28150 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
28160 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
28170 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
28180 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
28190 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
281a0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
281b0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
281c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
281d0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
281e0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
281f0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
28200 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
28210 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
28220 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28230 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
28240 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
28250 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
28260 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
28270 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
28280 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
28290 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
282a0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
282b0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
282c0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
282d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
282e0 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
282f0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
28300 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
28310 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
28320 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
28330 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
28340 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
28350 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
28360 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
28370 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
28380 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
28390 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
283a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
283b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
283c0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
283d0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
283e0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
283f0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
28400 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
28410 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
28420 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
28430 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
28440 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
28450 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28460 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28470 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
28480 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
28490 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
284a0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
284b0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
284c0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
284d0 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
284e0 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
284f0 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
28500 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
28510 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
28520 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28530 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
28540 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
28550 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
28560 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
28570 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
28580 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
28590 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
285a0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
285b0 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
285c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
285d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
285e0 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
285f0 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
28600 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
28610 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
28620 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
28630 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
28640 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
28650 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
28660 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
28670 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28680 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28690 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
286a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
286b0 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
286c0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
286d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
286e0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
286f0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
28700 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
28710 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
28720 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
28730 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
28740 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
28750 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
28760 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
28770 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
28780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
28790 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
287a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
287b0 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
287c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
287d0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
287e0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
287f0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
28800 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
28810 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
28820 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
28830 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
28840 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
28850 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
28860 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
28870 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
28880 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
28890 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
288a0 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
288b0 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
288c0 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
288d0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
288e0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
288f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28900 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
28910 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
28920 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
28930 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28940 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
28950 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
28960 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
28970 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
28980 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
28990 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
289a0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
289b0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
289c0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
289d0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
289e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
289f0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
28a00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
28a10 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
28a20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
28a30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
28a40 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
28a50 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
28a60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
28a70 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
28a80 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
28a90 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
28aa0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
28ab0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
28ac0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
28ad0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
28ae0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
28af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28b00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
28b10 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
28b20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
28b30 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
28b40 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
28b50 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
28b60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28b70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
28b80 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
28b90 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
28ba0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
28bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
28bc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
28bd0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
28be0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
28bf0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
28c00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28c10 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
28c20 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
28c30 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
28c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
28c50 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28c60 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
28c70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28c80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
28c90 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
28ca0 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
28cb0 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
28cc0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
28cd0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
28ce0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
28cf0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
28d00 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
28d10 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
28d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28d30 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
28d40 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
28d50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
28d60 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
28d70 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
28d80 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
28d90 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
28da0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
28db0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28dc0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
28dd0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
28de0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
28df0 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
28e00 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
28e10 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
28e20 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
28e30 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
28e40 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
28e50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
28e60 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
28e70 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28e80 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
28e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
28ea0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
28eb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
28ec0 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
28ed0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
28ee0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
28ef0 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
28f00 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
28f10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
28f20 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
28f30 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
28f40 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
28f50 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
28f60 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
28f70 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
28f80 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
28f90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
28fa0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
28fb0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28fc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
28fd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28fe0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
28ff0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
29000 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
29010 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
29020 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
29030 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
29040 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
29050 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
29060 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
29070 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
29080 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
29090 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
290a0 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
290b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
290c0 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
290d0 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
290e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
290f0 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
29100 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
29110 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
29120 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
29130 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
29140 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
29150 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
29160 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
29170 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
29180 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73  eturn a;.}.int s
29190 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
291a0 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
291b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
291c0 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B;.}.#endif../*.
291d0 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
291e0 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
291f0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
29200 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
29210 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
29220 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
29230 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
29240 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
29250 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
29260 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
29270 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
29280 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
29290 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
292a0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
292b0 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
292c0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
292d0 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
292e0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
292f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
29300 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
29310 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
29320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29330 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
29340 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
29350 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
29360 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
29370 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
29380 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29390 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
293a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
293b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
293c0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
293d0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
293e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
293f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29400 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
29410 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
29420 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
29430 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
29440 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29450 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
29460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
29470 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61  rnalOpen );.  pa
29480 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
29490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
294a0 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29  er->pInStmt==0 )
294b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  ;.  pPager->pInS
294c0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  tmt = sqlite3Bit
294d0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
294e0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67  ->dbSize);.  pag
294f0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
29500 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
29510 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
29520 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
29530 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
29540 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
29550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29560 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
29570 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
29580 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
29590 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
295a0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
295b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
295c0 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
295d0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
295e0 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
295f0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
29600 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
29610 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
29620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
29630 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
29640 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 53 51 4c  Pager->stfd, SQL
29650 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
29660 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
29670 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
29680 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
29690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
296a0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
296b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
296c0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
296d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
296e0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
296f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
29700 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
29710 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
29720 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  pInStmt ){.    s
29730 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
29740 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
29750 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
29760 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
29770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29780 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
29790 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
297a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
297b0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
297c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
297d0 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
297e0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  n(pPager);.  pag
297f0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29810 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
29820 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
29830 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
29840 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  mtCommit(Pager *
29850 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72  pPager){.  pager
29860 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
29870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
29880 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
29890 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
298a0 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
298b0 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
298c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
298d0 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
298e0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
298f0 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
29900 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
29910 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
29920 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
29930 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
29940 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61  Stmt);.      pPa
29950 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
29960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29970 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
29980 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
29990 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
299a0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
299b0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
299c0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
299d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
299e0 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
299f0 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mt;.        asse
29a00 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d  rt( pHist->inStm
29a10 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  t );.        pHi
29a20 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
29a30 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29a40 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
29a50 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
29a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29a70 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
29a80 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
29a90 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
29aa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29ab0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
29ac0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
29ad0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
29ae0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
29af0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
29b00 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
29b10 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
29b20 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
29b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29b40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
29b50 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
29b60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29b70 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
29b80 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
29b90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
29ba0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29bb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29bc0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
29bd0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
29be0 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
29bf0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29c00 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
29c10 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
29c20 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67  r *pPg;.      Pg
29c30 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
29c40 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
29c50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
29c60 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65  ; pPg=pHist->pNe
29c70 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
29c80 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
29c90 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
29ca0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
29cb0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
29cc0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
29cd0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
29ce0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
29cf0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
29d00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
29d10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
29d20 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
29d30 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
29d40 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29d50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29d60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
29d70 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
29d80 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ze;.      pager_
29d90 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
29da0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
29db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
29dd0 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
29de0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
29df0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29e00 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
29e10 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
29e20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
29e30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
29e40 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
29e50 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c  en = 0;.  pagerL
29e60 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
29e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29e80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
29e90 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
29ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29eb0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
29ec0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
29ed0 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
29ee0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
29ef0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
29f00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
29f10 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
29f20 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
29f30 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
29f40 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
29f50 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
29f60 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29f70 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
29f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29f90 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
29fa0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
29fb0 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
29fc0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
29fd0 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
29fe0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
29ff0 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
2a000 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2a010 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
2a020 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
2a030 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
2a040 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a050 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
2a060 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2a070 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
2a080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a090 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2a0a0 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
2a0b0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2a0c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2a0d0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
2a0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a0f0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2a100 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2a110 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2a120 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2a130 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
2a140 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a150 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2a160 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
2a170 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a180 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
2a190 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
2a1a0 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
2a1b0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2a1c0 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
2a1d0 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
2a1e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a1f0 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
2a200 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a210 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
2a220 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
2a230 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
2a240 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
2a250 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
2a260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a270 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
2a280 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
2a290 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
2a2a0 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
2a2b0 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
2a2c0 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
2a2d0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
2a2e0 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
2a2f0 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
2a300 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64  CodecArg;.}.#end
2a310 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2a320 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a330 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
2a340 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
2a350 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
2a360 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
2a370 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
2a380 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2a390 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
2a3a0 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
2a3b0 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
2a3c0 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
2a3d0 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
2a3e0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
2a3f0 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
2a400 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
2a410 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
2a420 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
2a430 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
2a440 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
2a450 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
2a460 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
2a470 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
2a480 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2a490 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
2a4a0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
2a4b0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
2a4c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
2a4d0 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
2a4e0 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
2a4f0 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
2a500 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
2a510 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
2a520 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2a530 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
2a540 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
2a550 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
2a560 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a570 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
2a580 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
2a590 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
2a5a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2a5b0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
2a5c0 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
2a5d0 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
2a5e0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
2a5f0 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
2a600 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
2a610 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
2a620 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2a630 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
2a640 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a650 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
2a660 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
2a670 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
2a680 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
2a690 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
2a6a0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
2a6b0 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20  . */.  int h;.  
2a6c0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
2a6d0 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45  o = 0;..  pagerE
2a6e0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
2a6f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
2a700 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
2a710 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
2a720 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
2a730 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
2a740 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
2a750 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a760 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
2a770 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
2a780 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
2a790 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
2a7a0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
2a7b0 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
2a7c0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
2a7d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
2a7e0 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
2a7f0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
2a800 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
2a810 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
2a820 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
2a830 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
2a840 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a850 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
2a860 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a870 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
2a880 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
2a890 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  Pg from its hash
2a8a0 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
2a8b0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
2a8c0 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
2a8d0 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
2a8e0 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
2a8f0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
2a900 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
2a910 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
2a920 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
2a930 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2a940 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
2a950 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
2a960 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
2a970 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
2a980 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
2a990 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
2a9a0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
2a9b0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
2a9c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2a9d0 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
2a9e0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2a9f0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
2aa00 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
2aa10 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
2aa20 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
2aa30 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
2aa40 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
2aa50 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
2aa60 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
2aa70 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65  nc = pPgOld->nee
2aa80 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dSync;.  }else{.
2aa90 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
2aaa0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  c = 0;.  }.  pPg
2aab0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  ->inJournal = sq
2aac0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
2aad0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2aae0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  al, pgno);..  /*
2aaf0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
2ab00 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
2ab10 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
2ab20 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
2ab30 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
2ab40 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2ab50 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
2ab60 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
2ab70 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
2ab80 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2ab90 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
2aba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2abb0 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
2abc0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
2abd0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
2abe0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
2abf0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
2ac00 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
2ac10 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
2ac20 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
2ac30 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
2ac40 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
2ac50 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
2ac60 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
2ac70 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  he = 1;.  pPager
2ac80 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2ac90 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
2aca0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
2acb0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
2acc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2acd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2ace0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
2acf0 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
2ad00 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
2ad10 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
2ad20 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
2ad30 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
2ad40 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
2ad50 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
2ad60 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
2ad70 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
2ad80 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49 6e      ** Pager.pIn
2ad90 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
2ada0 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
2adb0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
2adc0 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
2add0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
2ade0 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
2adf0 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
2ae00 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
2ae10 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
2ae20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
2ae30 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
2ae40 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2ae50 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
2ae60 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
2ae70 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
2ae80 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
2ae90 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
2aea0 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
2aeb0 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
2aec0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
2aed0 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
2aee0 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
2aef0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
2af00 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
2af10 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
2af20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2af30 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
2af40 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
2af50 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2af60 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
2af70 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
2af80 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2af90 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
2afa0 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
2afb0 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
2afc0 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
2afd0 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
2afe0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
2aff0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
2b000 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
2b010 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
2b020 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
2b030 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
2b040 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
2b050 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
2b060 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b070 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
2b080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b090 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2b0a0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
2b0b0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
2b0c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b0d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2b0e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
2b0f0 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50 67   (int)needSyncPg
2b100 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
2b110 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
2b120 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
2b130 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
2b140 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
2b150 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  cPgno);.      }.
2b160 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
2b170 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2b180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b190 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
2b1a0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
2b1b0 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20  PgHdr->needSync 
2b1c0 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
2b1d0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
2b1e0 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
2b1f0 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
2b200 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
2b210 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  Hdr);.  }..  pag
2b220 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
2b230 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b240 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
2b250 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2b260 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
2b270 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
2b280 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
2b290 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
2b2a0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
2b2b0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg){.  return PG
2b2c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
2b2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b2e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2b2f0 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
2b300 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
2b310 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
2b320 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
2b330 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2b340 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
2b350 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2b360 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
2b370 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2b380 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2b390 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
2b3a0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
2b3b0 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a  Pg, pPager):0);.
2b3c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2b3d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
2b3e0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
2b3f0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
2b400 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
2b410 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
2b420 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
2b430 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b440 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
2b450 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2b460 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
2b470 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2b480 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
2b490 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
2b4a0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
2b4b0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
2b4c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
2b4d0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
2b4e0 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
2b4f0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
2b500 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
2b510 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
2b520 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2b530 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
2b540 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
2b550 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
2b560 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
2b570 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
2b580 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
2b590 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
2b5a0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
2b5b0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
2b5c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b5d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2b5e0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
2b5f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2b600 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
2b610 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2b620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2b630 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
2b640 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
2b650 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2b660 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
2b670 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
2b680 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
2b690 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
2b6a0 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
2b6b0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
2b6c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2b6d0 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  eMode = eMode;. 
2b6e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
2b6f0 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
2b700 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
2b710 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
2b720 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
2b730 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
2b740 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
2b750 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
2b760 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2b770 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ERY, PAGER_JOURN
2b780 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72  ALMODE_DELETE or
2b790 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e   .** PAGER_JOURN
2b7a0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
2b7b0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
2b7c0 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
2b7d0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  then.** the jour
2b7e0 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  nal-mode is set 
2b7f0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
2b800 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
2b810 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
2b820 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
2b830 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
2b840 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  ETE or.** PAGER_
2b850 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2b860 49 53 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IST, indicating 
2b870 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
2b880 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
2b890 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  * journal-mode..
2b8a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2b8b0 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
2b8c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2b8d0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
2b8e0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
2b8f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
2b900 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
2b910 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2b920 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2b930 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
2b940 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2b950 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2b960 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
2b970 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2b980 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2b990 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2b9a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
2b9b0 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
2b9c0 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2b9d0 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30 20 26 26  ODE_DELETE>=0 &&
2b9e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2b9f0 44 45 5f 50 45 52 53 49 53 54 3e 3d 30 20 29 3b  DE_PERSIST>=0 );
2ba00 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
2ba10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2ba20 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f  ournalMode = eMo
2ba30 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
2ba40 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
2ba50 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
2ba60 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
2ba70 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
2ba80 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
2ba90 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
2baa0 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
2bab0 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
2bac0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2bad0 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
2bae0 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
2baf0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2bb00 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2bb10 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
2bb20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
2bb30 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
2bb40 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2bb50 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  _TEST./*.** Prin
2bb60 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
2bb70 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
2bb80 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
2bb90 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
2bba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2bbb0 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
2bbc0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
2bbd0 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
2bbe0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
2bbf0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
2bc00 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
2bc10 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
2bc20 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
2bc30 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
2bc40 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
2bc50 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
2bc60 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
2bc70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
2bc80 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
2bc90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
2bca0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2bcb0 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.