/ Hex Artifact Content
Login

Artifact 22241b59c80ca083a96816df434adb8c097afcd4:


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 32  : pager.c,v 1.42
0350: 30 20 32 30 30 38 2f 30 33 2f 32 30 20 31 31 3a  0 2008/03/20 11:
0360: 30 34 3a 32 31 20 64 61 6e 69 65 6c 6b 31 39 37  04:21 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 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
3fc0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
3fd0: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
3fe0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
3ff0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
4000: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4020: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
4030: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
4040: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4060: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
4070: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
4080: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
40c0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
40d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
40e0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
40f0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
4100: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
4110: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4120: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
4130: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
4140: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
4150: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4180: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
4190: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
41a0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
41d0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
41e0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
41f0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4210: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4220: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
4230: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
4240: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
4250: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
4260: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4270: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4280: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
4290: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
42a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42b0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
42c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
42d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
42f0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
4300: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
4310: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
4320: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4330: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
4340: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
4350: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
4360: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
4370: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
4380: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
4390: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
43a0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
43b0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
43c0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
43d0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
43e0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
43f0: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4400: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4410: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4420: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4430: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4440: 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b  Bitvec *pInStmt;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4460: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
4470: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
4480: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
4490: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
44a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
44b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
44c0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
44d0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
44e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
44f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4500: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
4510: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
4520: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4530: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
4540: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
4550: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72  .  char *zStmtJr
4560: 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nl;            /
4570: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74  * Name of the st
4580: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
45a0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  3_file *fd, *jfd
45b0: 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65  ;     /* File de
45c0: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
45d0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
45e0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
45f0: 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  file *stfd;     
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 20 66 6f 72 20 74 68 65 20 73  riptor for the s
4620: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4630: 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  nal*/.  BusyHand
4640: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
4650: 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  r;  /* Pointer t
4660: 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e  o sqlite.busyHan
4670: 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c  dler */.  PagerL
4680: 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20  ruList lru;     
4690: 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73        /* LRU lis
46a0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
46b0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
46c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
46d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
46e0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
46f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
4700: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4710: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
4720: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4730: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
4740: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
4750: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4760: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
4770: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4780: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
47a0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
47b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
47c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47e0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
47f0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
4800: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
4810: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
4820: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4830: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4840: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
4850: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
4860: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
4870: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
4880: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
4890: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
48a0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
48b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
48c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
48d0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
48e0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
48f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
4900: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
4910: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
4920: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4940: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4950: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4960: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4970: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4980: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49a0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49b0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49c0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
49d0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
49e0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
49f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a00: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
4a10: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
4a20: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
4a30: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
4a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4a50: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
4a60: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4a70: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
4a80: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
4a90: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
4aa0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
4ab0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
4ac0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
4ad0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
4ae0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
4af0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
4b00: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
4b10: 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20  int nHash;      
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4b30: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4b40: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
4b50: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20   PgHdr **aHash; 
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
4b80: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
4b90: 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66   PgHdr */.#ifdef
4ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4bb0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
4bc0: 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b  .  Pager *pNext;
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4be0: 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  * Doubly linked 
4bf0: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f  list of pagers o
4c00: 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67  n which */.  Pag
4c10: 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  er *pPrev;      
4c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
4c30: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4c40: 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a  ry() will work *
4c50: 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d  /.  int iInUseMM
4c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c70: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75  /* Non-zero if u
4c80: 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d  navailable to MM
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65   */.  int iInUse
4ca0: 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  DB;             
4cb0: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
4cc0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   in sqlite3_rele
4cd0: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a  ase_memory() */.
4ce0: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
4cf0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
4d00: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
4d10: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
4d20: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
4d30: 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  e */.  char dbFi
4d40: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
4d50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
4d60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
4d70: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
4d80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
4d90: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
4da0: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
4db0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
4dc0: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
4dd0: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
4de0: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
4df0: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
4e00: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
4e10: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
4e20: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
4e30: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
4e40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4e50: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e60: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
4e70: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e80: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
4e90: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
4ea0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4eb0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
4ec0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
4ed0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
4ee0: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
4ef0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4f00: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
4f10: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4f20: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
4f30: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e  to journal */.in
4f40: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4f50: 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30  pgfree_count = 0
4f60: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4f70: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72  f cache pages fr
4f80: 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  eed */.# define 
4f90: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
4fa0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
4fb0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
4fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4fd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
4fe0: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
4ff0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75  he head of a dou
5000: 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a  ble-linked list.
5010: 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73  ** of all pagers
5020: 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62   that are eligib
5030: 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61  le for page stea
5040: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73  ling by the.** s
5050: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
5060: 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63  emory() interfac
5070: 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68  e.  Access to th
5080: 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72  is list is.** pr
5090: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
50a0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
50b0: 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a  IC_MEM2 mutex..*
50c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
50d0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
50e0: 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20  NAGEMENT.static 
50f0: 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61  Pager *sqlite3Pa
5100: 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  gerList = 0;.sta
5110: 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73 74  tic PagerLruList
5120: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
5130: 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  ist = {0, 0, 0};
5140: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
5150: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
5160: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
5170: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
5180: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
5190: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
51a0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
51b0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
51c0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
51d0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
51e0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
51f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
5200: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
5210: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
5220: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
5230: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
5240: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
5250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5260: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
5270: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
5280: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
5290: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
52a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
52b0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
52c0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
52d0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
52e0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
52f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
5300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
5310: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
5320: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
5330: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
5340: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
5350: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
5360: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
5370: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
5380: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
5390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
53a0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
53b0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
53c0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
53d0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
53e0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
53f0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
5400: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
5410: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
5420: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
5430: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
5440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
5450: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
5460: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
5470: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
5480: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
5490: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
54a0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
54b0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
54c0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
54d0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
54e0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
54f0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
5500: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
5510: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
5520: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
5530: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5540: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
5550: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
5560: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
5570: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
5580: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
5590: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
55a0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
55b0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
55c0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
55d0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
55e0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
55f0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
5600: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
5610: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
5620: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
5630: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
5640: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
5650: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
5660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
5670: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
5680: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
5690: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
56a0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
56b0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
56c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
56d0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
56e0: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
56f0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
5700: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
5710: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
5720: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
5730: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
5740: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
5750: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
5760: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
5770: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5780: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
5790: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
57a0: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
57b0: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
57c0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
57d0: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
57e0: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
57f0: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
5800: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
5810: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
5820: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
5830: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
5840: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5850: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
5860: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
5870: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
5880: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
5890: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
58a0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
58b0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
58c0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
58d0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
58e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
58f0: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
5900: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
5910: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
5920: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
5930: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
5940: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
5950: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
5960: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
5970: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5980: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
5990: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
59a0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
59b0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
59c0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
59d0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
59e0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
59f0: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
5a00: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
5a10: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
5a20: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
5a30: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
5a40: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
5a50: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
5a60: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
5a70: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
5a80: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
5a90: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
5aa0: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
5ab0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
5ac0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
5ad0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
5ae0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
5af0: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
5b00: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
5b10: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
5b20: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
5b30: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
5b40: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
5b50: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
5b60: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5b70: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
5b80: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
5b90: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
5ba0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
5bb0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
5bc0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
5bd0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
5be0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
5bf0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
5c00: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
5c10: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  647../*.** The p
5c20: 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64 20  agerEnter() and 
5c30: 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f 75  pagerLeave() rou
5c40: 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61 6e  tines acquire an
5c50: 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d  d release.** a m
5c60: 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61 67  utex on each pag
5c70: 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20 69  er.  The mutex i
5c80: 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a  s recursive..**.
5c90: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70 65  ** This is a spe
5ca0: 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74  cial-purpose mut
5cb0: 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f  ex.  It only pro
5cc0: 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78 63  vides mutual exc
5cd0: 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lusion.** betwee
5ce0: 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64 20  n the Btree and 
5cf0: 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67  the Memory Manag
5d00: 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  ement sqlite3_re
5d10: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a  lease_memory().*
5d20: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  * function.  It 
5d30: 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e 74  does not prevent
5d40: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
5d50: 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20 61  wo Btrees from a
5d60: 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20  ccessing.** the 
5d70: 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74 68  same pager at th
5d80: 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74  e same time.  Ot
5d90: 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  her general-purp
5da0: 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a  ose mutexes in.*
5db0: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
5dc0: 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63 68  r handle that ch
5dd0: 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ore..*/.#ifdef S
5de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
5df0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
5e00: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
5e10: 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a 70  erEnter(Pager *p
5e20: 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  ){.    p->iInUse
5e30: 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  DB++;.    if( p-
5e40: 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e  >iInUseMM && p->
5e50: 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a 20  iInUseDB==1 ){. 
5e60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5e70: 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20 20  ex *mutex;.     
5e80: 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
5e90: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
5ea0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5eb0: 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70 2d  _MEM2);.      p-
5ec0: 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20  >iInUseDB = 0;. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5ee0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
5ef0: 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  .      p->iInUse
5f00: 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  DB = 1;.      sq
5f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
5f20: 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  e(mutex);.    }.
5f30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
5f40: 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20  InUseMM==0 );.  
5f50: 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  }.  static void 
5f60: 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65 72  pagerLeave(Pager
5f70: 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e   *p){.    p->iIn
5f80: 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73  UseDB--;.    ass
5f90: 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42  ert( p->iInUseDB
5fa0: 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >=0 );.  }.#else
5fb0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 45  .# define pagerE
5fc0: 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65  nter(X).# define
5fd0: 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23   pagerLeave(X).#
5fe0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
5ff0: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
6000: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b   end of the link
6010: 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  ed list managed 
6020: 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  by structure.** 
6030: 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d  pList (pPg becom
6040: 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  es the last entr
6050: 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20  y in the list - 
6060: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6070: 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67  y .** used). Arg
6080: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6090: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
60a0: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
60b0: 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64  pPg->gfree,.** d
60c0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
60d0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
60e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
60f0: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a  ger-specific or.
6100: 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  ** global LRU li
6110: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6120: 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65 72  id listAdd(Pager
6130: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6140: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6150: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6160: 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  {.  pLink->pNext
6170: 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70   = 0;.  pLink->p
6180: 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c  Prev = pList->pL
6190: 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ast;..#ifdef SQL
61a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
61b0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
61c0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
61d0: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
61e0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
61f0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6200: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6210: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6220: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6230: 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  if..  if( pList-
6240: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e  >pLast ){.    in
6250: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6260: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
6270: 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c  )pPg;.    PagerL
6280: 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e  ruLink *pLastLin
6290: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
62a0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
62b0: 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d  st->pLast)[iOff]
62c0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b  );.    pLastLink
62d0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20  ->pNext = pPg;. 
62e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
62f0: 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  rt(!pList->pFirs
6300: 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  t);.    pList->p
6310: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d  First = pPg;.  }
6320: 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  ..  pList->pLast
6330: 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70   = pPg;.  if( !p
6340: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6350: 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53  ed && pPg->needS
6360: 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ync==0 ){.    pL
6370: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
6380: 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  d = pPg;.  }.}..
6390: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67  /*.** Remove pPg
63a0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d   from the list m
63b0: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73 74  anaged by the st
63c0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
63d0: 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a  to by pList..**.
63e0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ** Argument pLin
63f0: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
6400: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6410: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6420: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20  , depending .** 
6430: 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69  on whether pPg i
6440: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  s being added to
6450: 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69   the pager-speci
6460: 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52  fic or global LR
6470: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6480: 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76  c void listRemov
6490: 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a  e(PagerLruList *
64a0: 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c  pList, PagerLruL
64b0: 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64  ink *pLink, PgHd
64c0: 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69  r *pPg){.  int i
64d0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
64e0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
64f0: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
6500: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6510: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6520: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6530: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6540: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
6550: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6560: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6570: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6580: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6590: 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  ..  if( pPg==pLi
65a0: 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20  st->pFirst ){.  
65b0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
65c0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
65d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
65e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20     pList->pLast 
6600: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6610: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6620: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61  >pPrev ){.    Pa
6630: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65  gerLruLink *pPre
6640: 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  vLink = (PagerLr
6650: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6660: 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69  )pLink->pPrev)[i
6670: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76  Off]);.    pPrev
6680: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
6690: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
66a0: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65    if( pLink->pNe
66b0: 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  xt ){.    PagerL
66c0: 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e  ruLink *pNextLin
66d0: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
66e0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
66f0: 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d  nk->pNext)[iOff]
6700: 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b  );.    pNextLink
6710: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d  ->pPrev = pLink-
6720: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6730: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
6740: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
6750: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69    PgHdr *p = pLi
6760: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77  nk->pNext;.    w
6770: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
6780: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
6790: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
67a0: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
67b0: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69   *)(&((u8 *)p)[i
67c0: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  Off]);.      p =
67d0: 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pL->pNext;.    
67e0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  }.    pList->pFi
67f0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
6800: 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65   }..  pLink->pNe
6810: 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  xt = pLink->pPre
6820: 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  v = 0;.}../* .**
6830: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6840: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   the list of fre
6850: 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20  e pages for the 
6860: 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65  pager. If .** me
6870: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6880: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6890: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
68a0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20   the global .** 
68b0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
68c0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
68d0: 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67  id lruListAdd(Pg
68e0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
68f0: 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65  tAdd(&pPg->pPage
6900: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6910: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6920: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6930: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6940: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6950: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6960: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6970: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6980: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6990: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
69a0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64  U));.    listAdd
69b0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
69c0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
69d0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
69e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
69f0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6a00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6a10: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6a20: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6a30: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6a40: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6a50: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6a60: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6a70: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6a80: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6a90: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6aa0: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ab0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6ac0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6ad0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6ae0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6af0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6b00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6b10: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6b20: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6b30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6b40: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6b50: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6b60: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6b70: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6b80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6b90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6ba0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6bb0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6bc0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c   listRemove(&sql
6bd0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6be0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6bf0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6c00: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6c10: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6c20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6c30: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6c40: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6c50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6c60: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74   called just aft
6c70: 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  er the needSync 
6c80: 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c  flag has been cl
6c90: 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c  eared.** from al
6ca0: 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20  l pages managed 
6cb0: 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61 6c  by pPager (usual
6cc0: 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6a  ly because the j
6cd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
6ce0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e  as just been syn
6cf0: 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65 73  ced). It updates
6d00: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75   the pPager->lru
6d10: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76 61  .pFirstSynced va
6d20: 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69  riable.** and, i
6d30: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6d40: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6d50: 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61  the sqlite3LruPa
6d60: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
6d70: 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ced.** variable 
6d80: 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
6d90: 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46  void lruListSetF
6da0: 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65 72  irstSynced(Pager
6db0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
6dc0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6dd0: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
6de0: 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64  lru.pFirst;.#ifd
6df0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6e00: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6e10: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  NT.  if( !pPager
6e20: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
6e30: 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c  gHdr *p;.    sql
6e40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6e50: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6e60: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6e70: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6e80: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
6e90: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6ea0: 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65  rst; p && p->nee
6eb0: 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65  dSync; p=p->gfre
6ec0: 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73  e.pNext);.    as
6ed0: 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e  sert(p==pPager->
6ee0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6ef0: 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72   || p==sqlite3Lr
6f00: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
6f10: 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c  Synced);.    sql
6f20: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
6f30: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
6f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
6f60: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6f70: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
6f80: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
6f90: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
6fa0: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
6fb0: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
6fc0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
6fd0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
6fe0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
6ff0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
7000: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
7010: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7020: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7030: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7050: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7060: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7070: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7080: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7090: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
70a0: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
70b0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
70c0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
70d0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
70e0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
70f0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
7100: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
7110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7120: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7130: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7140: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
7150: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
7160: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
7170: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
7180: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
7190: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
71a0: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
71b0: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
71c0: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
71d0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64  N-1))==0 );.#ifd
71e0: 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43  ef SQLITE_MALLOC
71f0: 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66  _SOFT_LIMIT.  if
7200: 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73 68  ( N*sizeof(aHash
7210: 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c  [0])>SQLITE_MALL
7220: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b  OC_SOFT_LIMIT ){
7230: 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f  .    N = SQLITE_
7240: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
7250: 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  T/sizeof(aHash[0
7260: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d  ]);.  }.  if( N=
7270: 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
7280: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
7290: 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
72a0: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ger);.  sqlite3F
72b0: 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49 54  aultBenign(SQLIT
72c0: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
72d0: 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d 3e  MALLOC, pPager->
72e0: 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48 61  aHash!=0);.  aHa
72f0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
7300: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
7310: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
7320: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
7330: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
7340: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20  NJECTOR_MALLOC, 
7350: 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0);.  pagerEnter
7360: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7370: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
7380: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
7390: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
73a0: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
73b0: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
73c0: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
73d0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
73e0: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
73f0: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
7400: 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50  >nHash = N;.  pP
7410: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48  ager->aHash = aH
7420: 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ash;.  for(pPg=p
7430: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
7440: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
7450: 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b  All){.    int h;
7460: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
7470: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  no==0 ){.      a
7480: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
7490: 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
74a0: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
74b0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
74c0: 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70  .    }.    h = p
74d0: 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29  Pg->pgno & (N-1)
74e0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
74f0: 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b  Hash = aHash[h];
7500: 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68  .    if( aHash[h
7510: 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68  ] ){.      aHash
7520: 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
7530: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
7540: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
7550: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
7560: 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  sh = 0;.  }.}../
7570: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
7580: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
7590: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
75a0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
75b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
75c0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
75d0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
75e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
75f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
7600: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
7610: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
7620: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
7630: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
7640: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
7650: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
7660: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
7670: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
7680: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
7690: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
76a0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
76b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
76c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
76d0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
76e0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
76f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
7710: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
7720: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
7730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7740: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
7750: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
7760: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
7770: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
7780: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
7790: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
77a0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
77b0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
77c0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
77d0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
77e0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
77f0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
7800: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
7810: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
7820: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
7830: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7840: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
7850: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
7860: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
7870: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
7880: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
7890: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
78a0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
78b0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
78c0: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
78d0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
78e0: 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f  If file pFd is o
78f0: 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  pen, call sqlite
7900: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69  3OsUnlock() on i
7910: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
7920: 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   osUnlock(sqlite
7930: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74  3_file *pFd, int
7940: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21   eLock){.  if( !
7950: 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  pFd->pMethods ){
7960: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7970: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
7980: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
7990: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
79b0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
79c0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
79d0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
79e0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
79f0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
7a00: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
7a10: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
7a20: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
7a30: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
7a40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7a50: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
7a60: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
7a70: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
7a80: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
7a90: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
7aa0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
7ab0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
7ac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7ad0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
7ae0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
7af0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
7b00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
7b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
7b20: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
7b30: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
7b40: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
7b50: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
7b60: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
7b70: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
7b80: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7b90: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
7ba0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
7bb0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
7bc0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
7bd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7be0: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
7bf0: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
7c00: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
7c10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7c20: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
7c30: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
7c40: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
7c50: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
7c60: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
7c70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
7c80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7c90: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
7ca0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
7cb0: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
7cc0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
7cd0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
7ce0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
7cf0: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
7d00: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
7d10: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
7d20: 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20  d);.    nPage = 
7d30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7d40: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
7d50: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7d60: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
7d70: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
7d80: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
7d90: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
7da0: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
7db0: 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51  thods || (dc&(SQ
7dc0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
7dd0: 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e  C|(nPage>>8))&&n
7de0: 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29  Sector<=nPage) )
7df0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55  {.    return JOU
7e00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7e10: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
7e20: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7e30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
7e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
7e50: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7e60: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
7e70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7e80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
7e90: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
7ea0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
7eb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7ec0: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
7ed0: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
7ee0: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
7ef0: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
7f00: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
7f10: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
7f20: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7f30: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
7f40: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7f50: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7f60: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
7f70: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7f80: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
7f90: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
7fa0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
7fb0: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
7fc0: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
7fd0: 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65  stent. Until the
7fe0: 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72   persisten error
7ff0: 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20   is cleared,.** 
8000: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
8010: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
8020: 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
8030: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
8040: 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ame .** error co
8050: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73  de..**.** A pers
8060: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64  istent error ind
8070: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
8080: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
8090: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
80a0: 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
80b0: 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
80c0: 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
80d0: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
80e0: 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
80f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
8100: 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
8110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
8120: 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
8130: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
8140: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65  ror occured, the
8150: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
8160: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
8170: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
8180: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8190: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
81a0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73  ager *pPager);.s
81b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
81c0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
81d0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
81e0: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
81f0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  xff;.  assert(. 
8200: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
8210: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
8220: 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
8230: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
8240: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
8250: 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
8260: 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
8270: 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
8280: 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c  if(.    rc2==SQL
8290: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
82a0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
82b0: 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  R ||.    rc2==SQ
82c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29  LITE_CORRUPT.  )
82d0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
82e0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
82f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8300: 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
8310: 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
8320: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
8330: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
8340: 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c  lready unlocked,
8350: 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f   call pager_unlo
8360: 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20  ck() now to.    
8370: 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65    ** clear the e
8380: 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65  rror state and e
8390: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70  nsure that the p
83a0: 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20  ager-cache is . 
83b0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65       ** complete
83c0: 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20  ly empty..      
83d0: 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75  */.      pager_u
83e0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
83f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8400: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
8410: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8420: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
8430: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
8440: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
8450: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
8460: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
8470: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
8480: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
8490: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
84a0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
84b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
84c0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
84d0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
84e0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
84f0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
8500: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8510: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
8520: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
8530: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
8540: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
8550: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
8560: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
8570: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
8580: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
8590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
85a0: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
85b0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
85c0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
85d0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
85e0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
85f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
8600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8610: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
8620: 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f  ed char *)PGHDR_
8630: 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b  TO_DATA(pPage));
8640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
8650: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
8660: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
8670: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
8680: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8690: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
86a0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
86b0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
86c0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
86d0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
86e0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
86f0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
8700: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
8710: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
8720: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
8730: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
8740: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
8750: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
8760: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
8770: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
8780: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
8790: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
87a0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
87b0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
87c0: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
87d0: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
87e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
87f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
8800: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
8810: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
8820: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
8830: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
8840: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
8850: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
8860: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  dif../*.** When 
8870: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
8880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8890: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
88a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
88b0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
88c0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
88d0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
88e0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
88f0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
8900: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
8910: 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  lied by the call
8920: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  er. .**.** zMast
8930: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
8940: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
8950: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
8960: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
8970: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
8980: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
8990: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
89a0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
89b0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
89c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
89d0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
89e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
89f0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
8a00: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
8a10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
8a20: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
8a30: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
8a40: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
8a50: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
8a60: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
8a70: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
8a80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
8a90: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
8aa0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
8ab0: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
8ac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8ad0: 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73   is present zMas
8ae0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
8af0: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
8b00: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
8b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
8b20: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
8b30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
8b40: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
8b50: 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a  , int nMaster){.
8b60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
8b70: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
8b80: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
8b90: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
8ba0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
8bb0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
8bc0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
8bd0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73  eader */..  zMas
8be0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c00: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
8c10: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
8c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
8c30: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
8c40: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
8c50: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
8c60: 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  16, &len);.  if(
8c70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
8c90: 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  f( len>=nMaster 
8ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8cb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
8cc0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8cd0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
8ce0: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
8cf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8d00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8d10: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
8d20: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
8d30: 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72   szJ-8);.  if( r
8d40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8d50: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
8d60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
8d70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8d80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8d90: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
8da0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
8db0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
8dc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8dd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8de0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
8df0: 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65   '\0';..  /* See
8e00: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
8e10: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
8e20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8e30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8e40: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
8e50: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
8e60: 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20  [i];.   }.  if( 
8e70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
8e80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
8e90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
8ea0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
8eb0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
8ec0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
8ed0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
8ee0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
8ef0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
8f00: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
8f10: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
8f20: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
8f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8f40: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
8f50: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
8f60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
8f70: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
8f80: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8f90: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
8fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
8fc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
8fd0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
8fe0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
8ff0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
9000: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
9010: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
9020: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
9030: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
9040: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
9050: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
9060: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
9070: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
9080: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
9090: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
90a0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
90b0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
90e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
90f0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
9100: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
9110: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9120: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
9130: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9140: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
9150: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
9160: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
9170: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
9180: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
9190: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
91a0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
91b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
91c0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
91d0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
91e0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
91f0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
9200: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9210: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
9220: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
9230: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9240: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
9250: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
9260: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
9270: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
9280: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
9290: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
92a0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
92b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
92c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
92d0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
92e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
92f0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
9300: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
9310: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
9320: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
9330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
9340: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
9350: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
9360: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
9370: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9380: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
9390: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
93a0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
93b0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
93c0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
93d0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
93e0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
93f0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
9400: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
9410: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
9420: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
9430: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
9440: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
9450: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
9460: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9470: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
9480: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
9490: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
94a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
94b0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
94c0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
94d0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
94e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
94f0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
9500: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
9510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
9520: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9530: 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20  pPager){.  char 
9540: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9550: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
9560: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
9570: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
9580: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
9590: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
95a0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
95b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20  urnalOff;.  }.. 
95c0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
95d0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
95e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
95f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9600: 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48  ff;..  memcpy(zH
9610: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
9620: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
9630: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
9640: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
9650: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
9660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9670: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
9680: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
9690: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
96a0: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
96b0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
96c0: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
96d0: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
96e0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
96f0: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
9700: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
9710: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
9720: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
9730: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
9740: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
9750: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
9760: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
9770: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
9780: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
9790: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
97a0: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
97b0: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
97c0: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
97d0: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
97e0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
97f0: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
9800: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
9810: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
9820: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
9830: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9840: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
9850: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
9860: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
9870: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
9880: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
9890: 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
98a0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
98b0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
98c0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
98d0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
98e0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
98f0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
9900: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
9910: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
9920: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
9930: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
9940: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
9950: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
9960: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
9970: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
9980: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
9990: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
99a0: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
99b0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
99c0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
99d0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
99e0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
99f0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
9a00: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
9a10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9a20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9a30: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
9a40: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e  thods||pPager->n
9a50: 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70  oSync);.  if( (p
9a60: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a  Pager->noSync) .
9a70: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
9a80: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
9a90: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
9aa0: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
9ab0: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
9ac0: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
9ad0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9ae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
9af0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
9b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
9b10: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
9b20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9b30: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
9b40: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
9b50: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
9b60: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
9b70: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
9b80: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
9b90: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
9ba0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
9bb0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
9bc0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
9bd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
9be0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9bf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
9c00: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
9c10: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
9c20: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9c30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
9c40: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ], pPager->dbSiz
9c50: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
9c60: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
9c70: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
9c80: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
9c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9cb0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
9cc0: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
9cd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9ce0: 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  dr==0 ){.    /* 
9cf0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
9d00: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9d10: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9d20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
9d30: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
9d40: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 49 4f 54 52  ize);.  }.  IOTR
9d50: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
9d60: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
9d70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
9d80: 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  lHdr, sizeof(zHe
9d90: 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73  ader))).  rc = s
9da0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9db0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
9dc0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
9dd0: 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er),pPager->jour
9de0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  nalOff);.  pPage
9df0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9e00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9e10: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54  pPager);..  /* T
9e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9e30: 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  r has been writt
9e40: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  en successfully.
9e50: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
9e60: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63  l.  ** file desc
9e70: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e  riptor to the en
9e80: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
9e90: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
9ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
9eb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ec0: 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20  IOTRACE(("JTAIL 
9ed0: 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
9ee0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9ef0: 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72  nalOff-1)).    r
9f00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9f10: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9f20: 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67 65  "\000", 1, pPage
9f30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
9f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9f50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
9f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9f70: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
9f80: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
9f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9fa0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
9fb0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
9fc0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
9fd0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9fe0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
9ff0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
a000: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
a010: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
a020: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
a030: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
a040: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
a050: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
a060: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
a070: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
a080: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
a090: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a0a0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
a0b0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
a0c0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
a0d0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
a0e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
a0f0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
a100: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a110: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
a120: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
a130: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
a140: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
a150: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
a160: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
a170: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
a180: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
a190: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
a1a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
a1b0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
a1c0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
a1d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
a1e0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
a1f0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
a200: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
a210: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
a220: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
a230: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
a240: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
a250: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
a260: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
a270: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
a280: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
a290: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
a2a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
a2b0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
a2c0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
a2d0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
a2e0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
a2f0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
a300: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
a310: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
a320: 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20   jrnlOff;.  int 
a330: 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65  iPageSize;..  se
a340: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
a350: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a360: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
a370: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a380: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
a390: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
a3a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a3b0: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
a3c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3d0: 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f;..  rc = sqlit
a3e0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a3f0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
a400: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72  zeof(aMagic), jr
a410: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
a420: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a430: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f  jrnlOff += sizeo
a440: 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66  f(aMagic);..  if
a450: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
a460: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a470: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
a480: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a490: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a4a0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
a4b0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a4c0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63  , jrnlOff, pNRec
a4d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a4e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a4f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a500: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a510: 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  +4, &pPager->cks
a520: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
a530: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a540: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a550: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a560: 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a  rnlOff+8, pDbSiz
a570: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
a580: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a590: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a5a0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a5b0: 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50  f+16, (u32 *)&iP
a5c0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
a5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
a5e0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d    && iPageSize>=
a5f0: 35 31 32 20 0a 20 20 20 26 26 20 69 50 61 67 65  512 .   && iPage
a600: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
a610: 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26  _PAGE_SIZE .   &
a620: 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  & ((iPageSize-1)
a630: 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a  &iPageSize)==0 .
a640: 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67    ){.    u16 pag
a650: 65 73 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a  esize = iPageSiz
a660: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
a670: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a680: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61 67  ize(pPager, &pag
a690: 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  esize);.  }.  if
a6a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a6b0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a700: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a710: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a720: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a730: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a740: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a750: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a760: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a770: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a780: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a790: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a7a0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a7b0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a7c0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a7d0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a7e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a7f0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a800: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a810: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a820: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a830: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a840: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a850: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a860: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a870: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a880: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a8a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a8b0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a8c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a8d0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a8e0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a8f0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a900: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a910: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a920: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a930: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a940: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a950: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a960: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a970: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a980: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a990: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a9a0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a9b0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a9c0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a9d0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a9e0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a9f0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
aa00: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
aa10: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
aa20: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
aa30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aa40: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
aa50: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
aa60: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
aa70: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
aa80: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
aa90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
aaa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
aab0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
aac0: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
aad0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
aae0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
aaf0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
ab00: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
ab10: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
ab20: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
ab30: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
ab40: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
ab50: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
ab60: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
ab70: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
ab80: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
ab90: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
aba0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
abb0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
abc0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
abd0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
abe0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
abf0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
ac00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ac10: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
ac20: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
ac30: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
ac40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ac50: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ac60: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
ac70: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
ac80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
ac90: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
aca0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
acb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
acc0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
acd0: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
ace0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
acf0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
ad00: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
ad10: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
ad20: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
ad30: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
ad40: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
ad50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
ad60: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
ad70: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
ad80: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ad90: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
ada0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
adb0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
adc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
add0: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
ade0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
adf0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
ae00: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
ae10: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
ae20: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
ae30: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ae40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ae50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ae60: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
ae70: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ae80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
ae90: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
aea0: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
aeb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
aec0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
aed0: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
aee0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
aef0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
af00: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
af10: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
af20: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
af30: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
af40: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
af50: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
af60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
af70: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
af80: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
af90: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
afa0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
afb0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
afc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
afd0: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
afe0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
aff0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
b000: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
b010: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
b020: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
b030: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
b040: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
b050: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
b060: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
b070: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b080: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
b090: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
b0a0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
b0b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
b0c0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
b0d0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
b0e0: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
b0f0: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
b100: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
b110: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
b120: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
b130: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
b140: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
b150: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
b160: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b170: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b180: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
b190: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
b1a0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
b1b0: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
b1c0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
b1d0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
b1e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
b1f0: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
b200: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
b210: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
b220: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
b230: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
b240: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
b250: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
b260: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
b270: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
b280: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
b290: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
b2a0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b2b0: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
b2c0: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b2e0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b2f0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b300: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b310: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b320: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b330: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b340: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b350: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b360: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b370: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b380: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b390: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b3a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b3b0: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b3c0: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b3d0: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b3e0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b3f0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b400: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
b430: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b440: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
b450: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
b460: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
b470: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
b480: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
b490: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
b4a0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
b4b0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
b4c0: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
b4d0: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
b4e0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
b4f0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
b500: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b510: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b520: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b530: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b540: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b550: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
b560: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b570: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
b580: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b590: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b5a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52  pNext){.    IOTR
b5b0: 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
b5c0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
b5d0: 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
b5e0: 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
b5f0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
b600: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78  count);.    pNex
b610: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
b620: 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65  l;.    lruListRe
b630: 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73  move(pPg);.    s
b640: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d  qlite3_free(pPg-
b650: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
b660: 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
b670: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61    }.  assert(pPa
b680: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
b690: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b6a0: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
b6b0: 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73  Synced==0);.  as
b6c0: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
b6d0: 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50  .pLast==0);.  pP
b6e0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
b6f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
b700: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
b710: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70 50 61  Dirty = 0;.  pPa
b720: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
b730: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b740: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
b750: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
b760: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
b770: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
b780: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
b790: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b7a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b7b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b7c0: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
b7d0: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
b7e0: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
b7f0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
b800: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
b810: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
b820: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
b830: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
b840: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
b850: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
b860: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
b870: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
b880: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
b890: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
b8a0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
b8b0: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
b8c0: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
b8d0: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
b8e0: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
b8f0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
b900: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
b910: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
b940: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
b950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
b960: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
b970: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b980: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70        if( rc ) p
b990: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b9a0: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
b9b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
b9c0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
b9d0: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
b9e0: 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a  ager))..      /*
b9f0: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
ba00: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
ba10: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
ba20: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
ba30: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75   be.      ** tru
ba40: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
ba50: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
ba60: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
ba70: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
ba80: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61       ** cache ca
ba90: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
baa0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
bab0: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
bac0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bad0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bae0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
baf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bb00: 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  K ) pPager->errC
bb10: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
bb20: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
bb30: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
bb40: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
bb50: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
bb60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bb70: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
bb80: 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tfd);.          
bb90: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
bba0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
bbb0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
bbc0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
bbd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
bbe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
bbf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
bc00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
bc10: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
bc20: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
bc30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bc40: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
bc50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
bc60: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
bc70: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
bc80: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bc90: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
bca0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
bcb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
bcc0: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tOpen = 0;.     
bcd0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
bce0: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  nUse = 0;.      
bcf0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd00: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
bd10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd20: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
bd30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
bd40: 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
bd50: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bd60: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
bd70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
bd80: 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c     if( !MEMDB ||
bd90: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
bda0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bdb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
bdc0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
bdd0: 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  K;.      pPager-
bde0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
bdf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
be00: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
be10: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
be20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
be30: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
be40: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
be50: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
be60: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
be70: 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
be80: 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64  ror state, .** d
be90: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
bea0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e rollback..*/.s
beb0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
bec0: 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
bed0: 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 61  k(Pager *p){.  a
bee0: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
bef0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bf00: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
bf10: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
bf20: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
bf30: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
bf40: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bf50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
bf60: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  gerRollback(p);.
bf70: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
bf80: 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  ck(p);.  assert(
bf90: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
bfa0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  p->journalOpen |
bfb0: 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d  | (p->exclusiveM
bfc0: 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c  ode&&!p->journal
bfd0: 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Off) );.  assert
bfe0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
bff0: 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20  !p->stmtOpen || 
c000: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
c010: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   );.}../*.** Thi
c020: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
c030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41   transaction.  A
c040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
c050: 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a  ended by either.
c060: 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  ** a COMMIT or a
c070: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
c080: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
c090: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
c0a0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
c0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
c0c0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
c0d0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
c0e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
c0f0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
c100: 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73  tine will releas
c110: 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
c120: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
c130: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
c140: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69  k in its place i
c150: 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65  f that is.** the
c160: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69   appropriate thi
c170: 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61  ng to do.  Relea
c180: 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79  se locks usually
c190: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c   is appropriate,
c1a0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72  .** unless we ar
c1b0: 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61  e in exclusive a
c1c0: 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e  ccess mode or un
c1d0: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a  less this is a .
c1e0: 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45  ** COMMIT AND BE
c1f0: 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  GIN or ROLLBACK 
c200: 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74  AND BEGIN operat
c210: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ion..**.** The j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65  ournal file is e
c230: 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72  ither deleted or
c240: 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a   truncated..**.*
c250: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
c260: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
c270: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
c280: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
c290: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
c2a0: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
c2b0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
c2c0: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
c2d0: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
c2e0: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
c2f0: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
c300: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
c310: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
c320: 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
c330: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
c340: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
c350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
c360: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c370: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
c380: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
c390: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c3a0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c3c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
c3d0: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
c3e0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
c3f0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26  ager->stmtOpen &
c400: 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
c410: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c420: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c430: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
c440: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
c450: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
c460: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c470: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
c480: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c490: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20  veMode .        
c4a0: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
c4b0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
c4c0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
c4d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20  QLITE_OK ){;.   
c4e0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c4f0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c500: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c510: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c530: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c540: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c550: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c560: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
c570: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c580: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
c590: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
c5a0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
c5b0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
c5c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c5d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
c5e0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c5f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c600: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
c610: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c620: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
c630: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
c640: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
c650: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
c660: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
c670: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
c680: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
c690: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
c6a0: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
c6b0: 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ack = 0;.#ifdef 
c6c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c6d0: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
c6e0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c6f0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
c700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
c710: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
c720: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
c730: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
c740: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
c750: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
c760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c770: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
c780: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c790: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
c7a0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
c7b0: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
c7c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
c7d0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c7e0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
c7f0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
c800: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
c810: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
c820: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
c830: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
c840: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
c850: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
c860: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c870: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
c880: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
c890: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
c8a0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
c8b0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
c8c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
c8d0: 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74   0;.  lruListSet
c8e0: 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
c8f0: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
c900: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
c910: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
c920: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
c930: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
c940: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
c950: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
c960: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
c970: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
c980: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
c990: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
c9a0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c9b0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
c9c0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
c9d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
c9e0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
c9f0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
ca00: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
ca10: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
ca20: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
ca30: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
ca40: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
ca50: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
ca60: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
ca70: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
ca80: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
ca90: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
caa0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
cab0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
cac0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
cad0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
cae0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
caf0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
cb00: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
cb10: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
cb20: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
cb30: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
cb40: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
cb50: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
cb60: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
cb70: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
cb80: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
cb90: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
cba0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
cbb0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
cbc0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
cbd0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
cbe0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
cbf0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
cc00: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
cc10: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
cc20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
cc30: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
cc40: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
cc50: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
cc60: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
cc70: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
cc80: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
cc90: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
cca0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
ccb0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
ccc0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
ccd0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
cce0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
ccf0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
cd00: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
cd10: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
cd20: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
cd30: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
cd40: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
cd50: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
cd60: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
cd70: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
cd80: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
cd90: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
cda0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
cdb0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
cdc0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
cdd0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
cde0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
cdf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
ce00: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
ce10: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
ce20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
ce30: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
ce40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
ce50: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ce60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce70: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
ce80: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
ce90: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
cea0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
ceb0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
cec0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
ced0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
cee0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
cef0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
cf00: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
cf10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
cf20: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
cf30: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
cf40: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
cf50: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
cf60: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
cf70: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
cf80: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
cf90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
cfa0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
cfb0: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
cfc0: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
cfd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
cfe0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d000: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
d010: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
d020: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
d050: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
d060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d070: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
d080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d090: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
d0a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
d0b0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
d0c0: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
d0d0: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
d0e0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
d0f0: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
d100: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
d110: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
d120: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
d130: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
d140: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d150: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
d160: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
d170: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
d180: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
d190: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
d1a0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
d1b0: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
d1c0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
d1d0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
d1e0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
d1f0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
d200: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
d210: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
d220: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
d230: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
d240: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
d250: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
d260: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
d270: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
d280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
d290: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
d2a0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
d2b0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
d2c0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
d2d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
d2e0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
d2f0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
d300: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
d310: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
d320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
d330: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
d340: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
d350: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
d360: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
d370: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
d380: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
d390: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
d3a0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
d3b0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
d3c0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
d3d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
d3e0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
d3f0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
d400: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d410: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
d420: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
d430: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
d440: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
d450: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d460: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
d470: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
d480: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
d490: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
d4a0: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
d4b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d4c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
d4d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d4e0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
d4f0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
d500: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
d510: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d520: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
d530: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
d540: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
d550: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d560: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
d570: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
d580: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
d590: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
d5a0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
d5b0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
d5c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
d5d0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
d5e0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
d5f0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
d600: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
d610: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
d620: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d630: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
d640: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
d650: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
d660: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
d670: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
d680: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
d690: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
d6a0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
d6b0: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
d6c0: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
d6d0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
d6e0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
d6f0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
d700: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
d710: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
d720: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
d730: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
d740: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
d750: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
d760: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
d770: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
d780: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
d790: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
d7a0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
d7b0: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
d7c0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
d7d0: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
d7e0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
d7f0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
d800: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
d810: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
d820: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
d830: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
d840: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
d850: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
d860: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
d870: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
d880: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d890: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
d8a0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
d8b0: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
d8c0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
d8d0: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
d8e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
d8f0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
d900: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
d910: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
d920: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
d930: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
d940: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
d950: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
d960: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
d970: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
d980: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
d990: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
d9a0: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
d9b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
d9c0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
d9d0: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
d9e0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
d9f0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
da00: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
da10: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
da20: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
da30: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
da40: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
da50: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
da60: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
da70: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
da80: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
da90: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
daa0: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
dab0: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
dac0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
dad0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
dae0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
daf0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
db00: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
db10: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
db20: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
db30: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
db40: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
db50: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
db60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
db70: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
db80: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
db90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
dba0: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
dbb0: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
dbc0: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
dbd0: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
dbe0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
dbf0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
dc00: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
dc10: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
dc20: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
dc30: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
dc40: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
dc50: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
dc60: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
dc70: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
dc80: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
dc90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
dca0: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
dcb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
dcc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
dcd0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
dce0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
dcf0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
dd00: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
dd10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
dd20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd30: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
dd40: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
dd50: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
dd60: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
dd70: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
dd80: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
dd90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
dda0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
ddb0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
ddc0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
ddd0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
dde0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
ddf0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
de00: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
de10: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
de20: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
de30: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
de40: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
de50: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
de60: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
de70: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
de80: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
de90: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
dea0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
deb0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
dec0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
ded0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
dee0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
def0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
df00: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
df10: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
df20: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
df30: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
df40: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
df50: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
df60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
df70: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
df80: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
df90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
dfa0: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
dfb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
dfc0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
dfd0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
dfe0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
dff0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
e000: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
e010: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
e020: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
e030: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
e040: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
e050: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
e060: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
e070: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
e080: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
e090: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
e0a0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
e0b0: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
e0c0: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
e0d0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
e0e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e0f0: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
e100: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
e110: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
e120: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
e130: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
e140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
e160: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
e170: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
e180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e190: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
e1a0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
e1b0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
e1c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e1d0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
e1e0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
e1f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e200: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
e210: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
e220: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e230: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
e240: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
e250: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
e260: 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
e270: 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
e280: 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
e290: 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
e2a0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
e2b0: 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
e2c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
e2d0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
e2e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e2f0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
e300: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
e310: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
e320: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
e330: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
e340: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
e350: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
e360: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
e370: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
e380: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
e390: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
e3a0: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
e3b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
e3c0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
e3d0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
e3e0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
e3f0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
e400: 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
e410: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
e420: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
e430: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e440: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
e450: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
e460: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
e470: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
e480: 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65  Master;.  sqlite
e490: 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
e4a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
e4b0: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
e4c0: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
e4d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e4e0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
e4f0: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
e500: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
e510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
e520: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
e530: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e540: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
e550: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
e560: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
e570: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
e580: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
e590: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
e5a0: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
e5b0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ence..  */.  pMa
e5c0: 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
e5d0: 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  file *)sqlite3_m
e5e0: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
e5f0: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
e600: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
e610: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
e620: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
e630: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
e640: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
e650: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e660: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
e670: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
e680: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
e690: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
e6a0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
e6b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e6c0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
e6d0: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
e6e0: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
e6f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e700: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
e710: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
e720: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
e730: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e740: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
e750: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
e760: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e770: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
e780: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
e790: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
e7a0: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
e7b0: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
e7c0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
e7d0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
e7e0: 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d  terPtr = pPager-
e7f0: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
e800: 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
e810: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
e820: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e830: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
e840: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
e850: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
e860: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
e870: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
e880: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
e890: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
e8a0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
e8b0: 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  _malloc(nMasterJ
e8c0: 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
e8d0: 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  Ptr);.    if( !z
e8e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
e8f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e900: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e910: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
e920: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
e930: 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
e940: 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
e950: 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20  erJournal];.    
e960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e970: 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
e980: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
e990: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
e9a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e9b0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
e9c0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
e9d0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
e9e0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
e9f0: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
ea00: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
ea10: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
ea20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
ea30: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
ea40: 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
ea50: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
ea60: 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  S) ){.        /*
ea70: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
ea80: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
ea90: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
eaa0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
eab0: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
eac0: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
ead0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
eae0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
eaf0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
eb00: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
eb10: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
eb20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
eb30: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
eb40: 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
eb50: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
eb60: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
eb70: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
eb80: 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
eb90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
eba0: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
ebb0: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
ebc0: 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
ebd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
ebe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ebf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
ec00: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
ec10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
ec20: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
ec30: 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
ec40: 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
ec50: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ec60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ec70: 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
ec80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ec90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
eca0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ecb0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ecc0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
ecd0: 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
ece0: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
ecf0: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
ed00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
ed10: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
ed20: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
ed30: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
ed40: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed50: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
ed60: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ed70: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ed80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ed90: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
eda0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
edb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
edc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
edd0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
ede0: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
edf0: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
ee00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
ee10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ee20: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
ee30: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
ee40: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
ee50: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
ee60: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
ee70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
ee80: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
ee90: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
eea0: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
eeb0: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
eec0: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
eed0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
eee0: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
eef0: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
ef00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ef10: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
ef20: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
ef30: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
ef40: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
ef50: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74  ile..**.** Might
ef60: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
ef70: 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
ef80: 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
ef90: 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a  ler than nPage..
efa0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ** This can happ
efb0: 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
efc0: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68   if we are in th
efd0: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72  e middle of a tr
efe0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  ansaction.** whi
eff0: 63 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20  ch has extended 
f000: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e  the file size an
f010: 64 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  d the new pages 
f020: 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65  are still all he
f030: 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20  ld.** in cache, 
f040: 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f  then an INSERT o
f050: 72 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20  r UPDATE does a 
f060: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
f070: 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65  ck.  Some.** ope
f080: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
f090: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
f0a0: 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
f0b0: 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20  f you try to.** 
f0c0: 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
f0d0: 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
f0e0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
f0f0: 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73   it currently is
f100: 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74  ,.** so detect t
f110: 68 69 73 20 63 61 73 65 20 61 6e 64 20 64 6f 20  his case and do 
f120: 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 75 6e 63  not do the trunc
f130: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
f140: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
f150: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
f160: 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  r, int nPage){. 
f170: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f180: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
f190: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
f1a0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61  EXCLUSIVE && pPa
f1b0: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
f1c0: 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  s ){.    i64 cur
f1d0: 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
f1e0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
f1f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
f200: 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
f210: 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
f220: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
f230: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
f240: 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
f250: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
f260: 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
f270: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
f280: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
f290: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
f2a0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Size);.    }.  }
f2b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f2c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
f2d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
f2e0: 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
f2f0: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
f300: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
f310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f320: 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69  Set the sectorSi
f330: 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ze for the given
f340: 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pager..**.** Th
f350: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
f360: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
f370: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72  he sector size r
f380: 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71  eported.** by sq
f390: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
f3a0: 65 28 29 20 61 6e 64 20 74 68 65 20 70 61 67 65  e() and the page
f3b0: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
f3c0: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
f3d0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
f3e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  ){.  assert(pPag
f3f0: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
f400: 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
f410: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
f420: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
f430: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
f440: 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
f450: 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
f460: 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
f470: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
f480: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
f490: 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
f4a0: 63 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  cih case the OsS
f4b0: 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
f4c0: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
f4d0: 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
f4e0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
f4f0: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
f500: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
f510: 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
f520: 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
f530: 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67  Size<pPager->pag
f540: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61  eSize ){.    pPa
f550: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
f560: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
f570: 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze;.  }.}../*.**
f580: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
f590: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
f5a0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
f5b0: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
f5c0: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
f5d0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
f5e0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
f5f0: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
f600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f610: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
f620: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
f630: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
f640: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
f650: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
f660: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
f670: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
f680: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
f690: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
f6a0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
f6b0: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
f6c0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
f6d0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
f6e0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
f6f0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
f700: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
f710: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f720: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
f730: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
f740: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
f750: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
f760: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
f770: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
f780: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
f790: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
f7a0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
f7b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
f7c0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
f7d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
f7e0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
f7f0: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
f800: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
f810: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
f820: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
f830: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f840: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
f850: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
f860: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
f870: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
f880: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
f890: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
f8a0: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
f8b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f8c0: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
f8d0: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
f8e0: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
f8f0: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
f900: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
f910: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
f920: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
f930: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
f940: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
f950: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
f960: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
f970: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
f980: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
f990: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
f9a0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
f9b0: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
f9c0: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
f9d0: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
f9e0: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
f9f0: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
fa00: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
fa10: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
fa20: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
fa30: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
fa40: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
fa50: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
fa60: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
fa70: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
fa80: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
fa90: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
faa0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
fab0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
fac0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
fad0: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
fae0: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
faf0: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
fb00: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
fb10: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
fb20: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
fb30: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
fb40: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
fb50: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
fb60: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
fb70: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
fb80: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
fb90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fba0: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
fbb0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
fbc0: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
fbd0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
fbe0: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
fbf0: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
fc00: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
fc10: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fc20: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
fc30: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
fc40: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
fc50: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
fc60: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
fc70: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
fc80: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
fc90: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
fca0: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
fcb0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
fcc0: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
fcd0: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
fce0: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
fcf0: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
fd00: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
fd10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
fd20: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
fd30: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
fd40: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
fd50: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
fd60: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
fd70: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
fd80: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
fd90: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
fda0: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
fdb0: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
fdc0: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
fdd0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
fde0: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
fdf0: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
fe00: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
fe10: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
fe20: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
fe30: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
fe40: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
fe50: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
fe60: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
fe70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
fe80: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
fe90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
fea0: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
feb0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
fec0: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
fed0: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
fee0: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
fef0: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
ff00: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
ff10: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ff20: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
ff30: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
ff40: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
ff50: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
ff60: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
ff70: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
ff80: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
ff90: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
ffa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
ffb0: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
ffc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
ffd0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
ffe0: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
fff0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
10000 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
10010 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10020 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
10030 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
10040 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
10050 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
10060 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
10070 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
10080 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
100a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
100b0 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
100c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
100d0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
100e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
100f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10110 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
10120 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
10130 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10140 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
10150 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
10160 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10180 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
10190 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
101a0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
101b0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
101c0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
101d0 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
101e0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
101f0 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
10200 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
10210 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
10220 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
10230 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
10240 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
10250 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10260 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
10270 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
10280 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
10290 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
102a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
102b0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
102c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
102d0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
102e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
102f0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
10300 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
10310 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
10320 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10330 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
10340 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
10350 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
10360 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
10370 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
10380 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
10390 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
103a0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
103b0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
103c0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
103d0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
103e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
103f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
10400 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
10410 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
10420 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 61 73 73 65  hname+1);.  asse
10430 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
10440 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
10450 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 7c  =SQLITE_OK .   |
10460 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  | (zMaster[0] &&
10470 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73   !sqlite3OsAcces
10480 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
10490 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
104a0 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20  XISTS)) .  ){.  
104b0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
104c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
104d0 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
104e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
104f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10500 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
10510 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
10520 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  zMaster = 0;..  
10530 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
10540 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
10550 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
10560 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
10570 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
10580 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
10590 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
105a0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
105b0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
105c0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
105d0 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
105e0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
105f0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
10600 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
10610 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
10620 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
10630 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
10640 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
10650 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
10660 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
10670 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
10680 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
10690 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
106a0 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
106b0 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
106c0 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
106d0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
106e0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
106f0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
10700 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10710 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
10720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10730 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
10740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
10750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10760 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
10770 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
10780 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
10790 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
107a0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
107b0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
107c0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
107d0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
107e0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
107f0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
10800 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
10810 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
10820 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
10830 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
10840 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
10850 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
10860 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
10870 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
10880 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
10890 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
108a0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
108b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
108c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
108d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
108e0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
108f0 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
10900 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10910 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
10920 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
10930 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
10940 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
10950 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
10960 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
10970 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
10980 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
10990 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
109a0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
109b0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
109c0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
109d0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
109e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
109f0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
10a00 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
10a10 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
10a20 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
10a30 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
10a40 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
10a50 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
10a60 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
10a70 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
10a80 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
10a90 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
10aa0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
10ab0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
10ac0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
10ad0 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
10ae0 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
10af0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
10b00 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10b10 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
10b20 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
10b30 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
10b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10b50 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
10b60 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
10b70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
10b80 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
10b90 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
10ba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
10bb0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
10bc0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
10bd0 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
10be0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
10bf0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
10c00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
10c10 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10c20 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
10c30 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
10c40 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
10c50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c70 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10c80 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
10c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
10ca0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
10cb0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
10cc0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
10cd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
10ce0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
10cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
10d00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
10d10 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
10d20 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
10d30 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
10d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d50 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  f, 1);.      if(
10d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
10d80 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
10d90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
10dc0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
10dd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10de0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10df0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
10e00 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
10e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10e20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
10e30 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
10e40 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
10e50 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
10e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10e70 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
10e80 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
10e90 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
10ea0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
10eb0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10ec0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
10ed0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d  Pathname+1);.  }
10ee0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
10f00 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
10f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
10f20 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
10f30 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
10f40 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20  er[0] ){.    /* 
10f50 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
10f60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
10f70 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
10f80 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
10f90 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
10fa0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
10fb0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
10fc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
10fd0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
10fe0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
10ff0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
11000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
11010 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
11020 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
11030 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
11040 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
11050 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
11060 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
11070 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
11080 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
11090 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
110a0 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
110b0 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
110c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
110d0 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
110e0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
110f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11100 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
11110 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11120 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
11130 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
11140 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
11150 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11160 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
11170 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
11180 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
11190 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
111a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
111b0 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
111c0 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
111d0 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
111e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
111f0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
11200 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
11210 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
11220 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
11230 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
11240 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
11250 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
11260 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
11270 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
11280 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
11290 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
112a0 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
112b0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
112c0 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
112d0 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
112e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
112f0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
11300 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11310 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
11320 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11330 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
11340 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
11350 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
11360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
11380 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
11390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
113a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
113b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
113c0 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
113d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
113e0 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
113f0 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
11400 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
11410 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11420 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a  ger->jfd, &os_sz
11430 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  J);.    if( rc!=
11440 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
11450 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
11460 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29  t( szJ==os_szJ )
11470 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
11480 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
11490 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
114a0 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
114b0 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
114c0 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
114d0 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
114e0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
114f0 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
11500 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
11510 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11520 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
11530 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
11540 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
11550 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
11560 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
11570 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
11580 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
11590 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
115a0 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
115b0 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
115c0 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
115d0 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
115e0 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
115f0 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
11600 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
11610 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
11620 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
11630 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
11640 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  tmtSize);.  asse
11650 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
11660 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
11670 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
11680 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
11690 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
116a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
116b0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
116c0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
116d0 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
116e0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
116f0 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
11700 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
11710 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
11720 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
11730 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11740 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
11750 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
11760 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
11770 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
11780 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
11790 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
117a0 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
117b0 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
117c0 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
117d0 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
117e0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
117f0 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
11800 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
11810 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f   i++){.    i64 o
11820 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61  ffset = i*(4+pPa
11830 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
11840 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11850 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11860 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11870 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30  >stfd, offset, 0
11880 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
11890 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
118a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
118b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
118c0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
118d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
118e0 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
118f0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
11900 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11910 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
11920 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
11930 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
11940 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
11950 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
11960 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
11970 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
11980 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
11990 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
119a0 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
119b0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
119c0 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
119d0 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
119e0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
119f0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
11a00 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
11a10 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
11a20 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
11a30 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
11a40 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
11a50 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
11a60 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11a70 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ion..  */.  pPag
11a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11a90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
11aa0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
11ab0 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
11ac0 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
11ad0 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
11ae0 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
11af0 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
11b00 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
11b10 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
11b20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
11b30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
11b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
11b50 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11b60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11b70 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
11b80 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
11b90 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
11ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11bb0 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
11bc0 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
11bd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11be0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
11bf0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
11c00 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
11c10 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
11c20 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
11c30 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
11c40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11c60 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11c70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
11c80 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
11c90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
11ca0 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
11cb0 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
11cc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11cd0 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
11ce0 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
11cf0 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
11d00 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
11d10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
11d20 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
11d30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
11d40 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
11d50 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
11d60 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11d70 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
11d80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11d90 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
11da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11db0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
11dc0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
11dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
11de0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11df0 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
11e00 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
11e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
11e20 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
11e30 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
11e40 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
11e50 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
11e60 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
11e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e80 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
11e90 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
11ea0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
11eb0 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
11ec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
11ed0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
11ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11ef0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
11f00 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
11f10 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
11f20 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
11f30 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
11f40 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
11f50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
11f60 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
11f70 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
11f80 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
11f90 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
11fa0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
11fb0 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
11fc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
11fd0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
11fe0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
11ff0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
12000 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
12010 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
12020 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
12030 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
12040 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
12050 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
12070 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
12080 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
12090 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
120a0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
120b0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
120c0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
120d0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
120e0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
120f0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
12100 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
12110 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
12120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
12130 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
12140 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
12150 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
12160 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
12170 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
12180 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
12190 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
121a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
121c0 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
121d0 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
121e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
121f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12200 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
12210 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
12220 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
12230 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12240 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
12250 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
12260 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12270 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
12280 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
12290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
122a0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
122c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
122d0 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
122e0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
122f0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
12300 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
12310 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
12320 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
12330 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
12340 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
12350 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
12360 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
12370 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
12380 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
12390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
123a0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
123b0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
123c0 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
123d0 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
123e0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
123f0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
12400 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
12410 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
12420 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
12430 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
12440 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
12450 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
12460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12470 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
12480 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
12490 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
124a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
124b0 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
124c0 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  l_fsync){.  pPag
124d0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
124e0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
124f0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
12500 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
12510 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
12520 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12530 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
12540 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79  lags = (full_fsy
12550 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
12560 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
12570 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
12580 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
12590 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
125a0 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
125b0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
125c0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
125d0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
125e0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
125f0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
12600 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
12610 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
12620 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
12630 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
12640 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
12650 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
12660 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
12670 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
12680 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
12690 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
126a0 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
126b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
126c0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
126d0 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
126e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
126f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
12700 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
12710 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
12720 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
12730 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
12740 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
12750 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68  orary.** file wh
12760 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
12770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12780 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
12790 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  emp(.  sqlite3_v
127a0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20  fs *pVfs,    /* 
127b0 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
127c0 20 73 79 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f   system layer */
127d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
127e0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
127f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
12800 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
12810 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12820 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
12830 20 74 68 65 20 66 69 6c 65 2e 20 20 4d 69 67 68   the file.  Migh
12840 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
12850 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
12860 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
12870 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
12880 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
12890 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
128a0 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
128b0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
128c0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
128d0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
128e0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
128f0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
12900 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
12910 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
12920 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
12930 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
12940 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
12950 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
12960 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
12970 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
12980 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
12990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
129a0 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  pen(pVfs, zFilen
129b0 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  ame, pFile, vfsF
129c0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
129d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
129e0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74  K || pFile->pMet
129f0 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e  hods );.  return
12a00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
12a10 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
12a20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
12a30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12a40 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
12a50 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
12a60 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
12a70 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
12a80 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
12a90 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
12aa0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
12ab0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
12ac0 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
12ad0 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
12ae0 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
12af0 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
12b00 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
12b10 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
12b20 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
12b30 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
12b40 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
12b50 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
12b60 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
12b70 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
12b80 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
12b90 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
12ba0 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
12bb0 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
12bc0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
12bd0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12be0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
12bf0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
12c00 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
12c10 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
12c20 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
12c30 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
12c40 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
12c50 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
12c60 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
12c70 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
12c80 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
12c90 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
12ca0 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
12cb0 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
12cc0 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
12cd0 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
12ce0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
12cf0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
12d00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12d10 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
12d20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
12d30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
12d40 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
12d50 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
12d60 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
12d70 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
12d80 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
12d90 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
12db0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
12dc0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
12dd0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
12de0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
12df0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
12e00 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
12e10 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
12e20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
12e30 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
12e40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12e50 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
12e60 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
12e70 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
12e80 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
12e90 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
12ea0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
12eb0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
12ec0 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
12ed0 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
12ee0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
12ef0 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
12f00 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
12f10 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ize = sqlite3Jou
12f20 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a  rnalSize(pVfs);.
12f30 20 20 69 6e 74 20 6e 44 65 66 61 75 6c 74 50 61    int nDefaultPa
12f40 67 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ge = SQLITE_DEFA
12f50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
12f60 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
12f70 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  ;.  int nPathnam
12f80 65 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  e;.  char *zStmt
12f90 4a 72 6e 6c 3b 0a 20 20 69 6e 74 20 6e 53 74 6d  Jrnl;.  int nStm
12fa0 74 4a 72 6e 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65  tJrnl;..  /* The
12fb0 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20   default return 
12fc0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
12fd0 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  r */.  *ppPager 
12fe0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
12ff0 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  te the full path
13000 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e  name */.  nPathn
13010 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
13020 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74  thname+1;.  zPat
13030 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  hname = sqlite3_
13040 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  malloc(nPathname
13050 2a 32 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  *2);.  if( zPath
13060 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
13070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13080 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
13090 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
130a0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
130b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
130c0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
130d0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
130e0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
130f0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
13100 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
13110 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
13120 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13130 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13140 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
13150 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
13160 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
13170 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13180 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
13190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74  c = sqlite3OsGet
131a0 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e  Tempname(pVfs, n
131b0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
131c0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
131d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
131e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
131f0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
13200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13210 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  nPathname = s
13220 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29  trlen(zPathname)
13230 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 74 68 65 20  ;..  /* Put the 
13240 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
13250 6c 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 64  l in temporary d
13260 69 73 6b 20 73 70 61 63 65 20 73 69 6e 63 65 20  isk space since 
13270 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 73 6f 6d  this is.  ** som
13280 65 74 69 6d 65 73 20 52 41 4d 20 64 69 73 6b 20  etimes RAM disk 
13290 6f 72 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  or other optimiz
132a0 65 64 20 73 74 6f 72 61 67 65 2e 20 20 55 6e 6c  ed storage.  Unl
132b0 69 6b 65 6c 79 20 74 68 65 20 6d 61 69 6e 0a 20  ikely the main. 
132c0 20 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   ** main journal
132d0 20 66 69 6c 65 2c 20 74 68 65 20 73 74 61 74 65   file, the state
132e0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
132f0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
13300 20 0a 20 20 2a 2a 20 63 6f 6c 6f 63 61 74 65 64   .  ** colocated
13310 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
13320 73 65 20 6e 6f 72 20 64 6f 65 73 20 69 74 20 6e  se nor does it n
13330 65 65 64 20 74 6f 20 62 65 20 70 65 72 73 69 73  eed to be persis
13340 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 7a 53 74  tent..  */.  zSt
13350 6d 74 4a 72 6e 6c 20 3d 20 26 7a 50 61 74 68 6e  mtJrnl = &zPathn
13360 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
13370 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13380 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  OsGetTempname(pV
13390 66 73 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  fs, pVfs->mxPath
133a0 6e 61 6d 65 2b 31 2c 20 7a 53 74 6d 74 4a 72 6e  name+1, zStmtJrn
133b0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
133c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
133d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
133e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
133f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 53 74  rn rc;.  }.  nSt
13400 6d 74 4a 72 6e 6c 20 3d 20 73 74 72 6c 65 6e 28  mtJrnl = strlen(
13410 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 0a 20 20 2f  zStmtJrnl);..  /
13420 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
13430 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  y for the pager 
13440 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
13450 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  Pager = sqlite3M
13460 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73  allocZero(.    s
13470 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
13480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13490 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
134a0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
134b0 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20  Size +          
134c0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
134d0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a  file structure *
134e0 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f  / .    pVfs->szO
134f0 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20 20  sFile * 3 +     
13500 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
13510 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61  b and two journa
13520 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
13530 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30  3*nPathname + 40
13540 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a   +          /* z
13550 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
13560 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a  tory, zJournal *
13570 2f 0a 20 20 20 20 6e 53 74 6d 74 4a 72 6e 6c 20  /.    nStmtJrnl 
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 2f 2a 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a    /* zStmtJrnl *
135a0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50  /.  );.  if( !pP
135b0 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ager ){.    sqli
135c0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
135d0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
135e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
135f0 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  }.  pPtr = (u8 *
13600 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
13610 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
13620 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50  = vfsFlags;.  pP
13630 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69  ager->fd = (sqli
13640 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
13650 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30  pVfs->szOsFile*0
13660 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66  ];.  pPager->stf
13670 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13680 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13690 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50  zOsFile*1];.  pP
136a0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c  ager->jfd = (sql
136b0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
136c0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
136d0 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  2];.  pPager->zF
136e0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
136f0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
13700 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46  sFile*2+journalF
13710 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  ileSize];.  pPag
13720 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
13730 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
13740 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
13750 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
13760 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
13770 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68  zDirectory[nPath
13780 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65  name+1];.  pPage
13790 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26  r->zStmtJrnl = &
137a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
137b0 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a  [nPathname+10];.
137c0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
137d0 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28   pVfs;.  memcpy(
137e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
137f0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
13800 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 6d 65  athname+1);.  me
13810 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74  mcpy(pPager->zSt
13820 6d 74 4a 72 6e 6c 2c 20 7a 53 74 6d 74 4a 72 6e  mtJrnl, zStmtJrn
13830 6c 2c 20 6e 53 74 6d 74 4a 72 6e 6c 2b 31 29 3b  l, nStmtJrnl+1);
13840 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13850 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zPathname);..  /
13860 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
13870 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
13880 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
13890 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
138a0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
138b0 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
138c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73  ->mxPathname - s
138d0 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
138e0 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
138f0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
13900 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13910 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
13920 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13930 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
13940 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
13950 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13980 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
13990 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
139a0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
139b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
139c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
139d0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
139e0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
139f0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
13a00 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
13a10 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
13a20 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
13a30 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
13a40 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
13a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
13a60 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
13a70 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
13a80 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
13a90 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
13aa0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
13ab0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
13ac0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
13ad0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
13ae0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
13af0 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
13b00 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
13b10 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
13b20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
13b30 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
13b40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13b50 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
13b60 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
13b70 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
13b80 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13b90 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
13bb0 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53 65 63  DefaultPage<iSec
13bc0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
13bd0 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67       nDefaultPag
13be0 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
13bf0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
13c00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13c10 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
13c20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
13c30 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
13c40 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
13c50 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
13c60 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
13c70 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
13c80 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13c90 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
13ca0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
13cb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
13cc0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
13cd0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
13ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
13cf0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
13d00 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13d10 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
13d20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65 66 61      for(ii=nDefa
13d30 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c  ultPage; ii<=SQL
13d40 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
13d50 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
13d60 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
13d70 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
13d80 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
13d90 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61 75 6c  i>>8)) ) nDefaul
13da0 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20 20 20  tPage = ii;.    
13db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13dc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
13dd0 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
13de0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
13df0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
13e00 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
13e10 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
13e20 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
13e30 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
13e40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13e50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65  .  }else if( !me
13e60 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mDb ){.    /* If
13e70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13e80 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
13e90 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
13ea0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
13eb0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
13ec0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
13ed0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
13ee0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
13ef0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
13f00 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
13f10 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
13f20 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
13f30 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
13f40 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
13f50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13f60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
13f70 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
13f80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13f90 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
13fa0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68  >pTmpSpace = (ch
13fb0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
13fc0 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50 61 67 65  loc(nDefaultPage
13fd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
13fe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
13ff0 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
14000 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a  e blocks above..
14010 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61    ** Free the Pa
14020 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
14030 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
14040 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65  ..  ** Since the
14050 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
14060 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
14070 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
14080 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
14090 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
140a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
140b0 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72  Pager || !pPager
140c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
140d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
140e0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
140f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14100 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
14110 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
14120 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
14130 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  M:rc);.  }..  PA
14140 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20  GERTRACE3("OPEN 
14150 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
14160 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
14170 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
14180 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43  ename);.  IOTRAC
14190 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
141a0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
141b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
141c0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67    /* Fill in Pag
141d0 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20  er.zDirectory[] 
141e0 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  */.  memcpy(pPag
141f0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
14200 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14210 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b  e, nPathname+1);
14220 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28  .  for(i=strlen(
14230 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
14240 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67  ry); i>0 && pPag
14250 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
14260 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
14270 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
14280 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
14290 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  i-1] = 0;..  /* 
142a0 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a  Fill in Pager.zJ
142b0 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d 65  ournal[] */.  me
142c0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
142d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  urnal, pPager->z
142e0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
142f0 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
14300 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
14310 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
14320 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20  ournal", 9);..  
14330 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
14340 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
14350 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
14360 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
14370 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
14380 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
14390 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
143a0 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
143b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
143c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
143d0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
143e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
143f0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
14400 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
14410 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
14420 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14430 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3b   = nDefaultPage;
14440 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14450 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
14460 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
14470 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
14480 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
14490 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
144a0 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b  r->mxPage = 100;
144b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
144c0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
144d0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
144e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
144f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
14500 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14510 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
14520 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
14530 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
14540 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20  UNLOCK) );.  /* 
14550 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
14560 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14570 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
14580 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
14590 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
145a0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
145b0 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
145c0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
145d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
145e0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
145f0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
14600 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
14610 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
14620 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
14630 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50   tempFile; .  pP
14640 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
14650 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
14660 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
14670 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
14680 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
14690 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
146a0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
146b0 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
146c0 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
146d0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
146e0 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
146f0 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
14700 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
14710 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
14720 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
14730 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14740 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
14750 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
14760 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
14770 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
14780 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
14790 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
147a0 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
147b0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
147c0 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29  memDb||tempFile)
147d0 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
147e0 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53  {.    setSectorS
147f0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
14800 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
14810 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
14820 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
14830 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
14840 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
14850 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
14860 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
14870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14880 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
14890 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
148a0 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a  ->iInUseMM = 0;.
148b0 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
148c0 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d  DB = 0;.  if( !m
148d0 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  emDb ){.    sqli
148e0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
148f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
14900 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
14910 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
14920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
14930 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
14940 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e  ;.    pPager->pN
14950 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ext = sqlite3Pag
14960 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  erList;.    if( 
14970 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
14980 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14990 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
149a0 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a  st->pPrev==0 );.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
149c0 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  erList->pPrev = 
149d0 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pPager;.    }.  
149e0 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20    pPager->pPrev 
149f0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
14a00 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67  PagerList = pPag
14a10 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
14a20 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14a30 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  x);.  }.#endif. 
14a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14a50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
14a60 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
14a70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
14a80 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
14a90 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
14aa0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
14ab0 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
14ac0 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
14ad0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
14ae0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
14af0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14b00 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
14b10 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
14b20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
14b30 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
14b40 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
14b50 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
14b60 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
14b70 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
14b80 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
14b90 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
14ba0 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
14bb0 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
14bc0 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
14bd0 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
14be0 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
14bf0 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
14c00 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
14c10 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
14c20 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
14c30 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
14c40 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
14c50 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
14c60 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
14c70 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
14c80 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
14c90 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
14ca0 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
14cb0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
14cc0 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
14cd0 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
14ce0 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
14cf0 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
14d00 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
14d10 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
14d20 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
14d30 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
14d40 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
14d50 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
14d60 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
14d70 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
14d80 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
14d90 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
14da0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
14db0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
14dc0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
14dd0 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
14de0 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
14df0 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
14e00 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
14e10 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
14e20 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
14e30 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
14e40 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
14e50 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
14e60 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
14e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14e80 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20  he page size to 
14e90 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74  *pPageSize. If t
14ea0 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
14eb0 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69  age size is.** i
14ec0 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
14ed0 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
14ee0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
14ef0 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61  et to that.** va
14f00 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
14f10 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
14f20 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14f30 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
14f40 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
14f50 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ze){.  int rc = 
14f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36  SQLITE_OK;.  u16
14f70 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
14f80 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
14f90 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
14fa0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
14fb0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
14fc0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
14fd0 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  E) );.  if( page
14fe0 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
14ff0 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
15000 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61 67 65  ze .   && !pPage
15010 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
15020 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29  er->nRef==0 .  )
15030 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
15040 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
15050 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69  e3_malloc(pageSi
15060 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e  ze);.    if( !pN
15070 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
15080 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
150a0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
150b0 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
150c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
150d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
150e0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
150f0 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  ;.      setSecto
15100 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
15110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15120 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
15130 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
15140 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
15150 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67 65  pNew;.      page
15160 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
15170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61      }.  }.  *pPa
15180 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
15190 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65 74  >pageSize;.  ret
151a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
151b0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
151c0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
151d0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
151e0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
151f0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
15200 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
15210 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
15220 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
15230 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
15240 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
15250 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
15260 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
15270 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
15280 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
15290 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
152a0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
152b0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
152c0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
152d0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
152e0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
152f0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
15300 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
15310 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
15320 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
15330 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
15340 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
15350 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15360 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
15370 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
15380 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
15390 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
153a0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
153b0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
153c0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
153d0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
153e0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
153f0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
15400 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
15410 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
15420 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
15430 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
15440 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
15450 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
15460 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
15470 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
15480 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
15490 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
154a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
154b0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
154c0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
154d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
154e0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  xPage;.  }.  sql
154f0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15500 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  nt(pPager);.  re
15510 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
15520 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
15530 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
15540 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
15550 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
15560 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
15570 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
15580 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
15590 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
155a0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
155b0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
155c0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
155d0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
155e0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
155f0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
15600 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
15610 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
15620 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
15630 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
15640 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
15650 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
15660 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
15670 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
15680 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
15690 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
156a0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
156b0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
156c0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
156d0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
156e0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
156f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
15700 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
15710 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
15720 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
15730 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
15740 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
15750 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
15760 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
15770 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
15780 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
15790 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
157a0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
157b0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
157c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
157d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
157e0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
157f0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
15800 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
15810 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
15820 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
15830 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
15840 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
15850 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
15860 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
15870 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
15880 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
15890 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
158a0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
158b0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
158c0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
158d0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
158e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
158f0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
15900 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
15910 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
15920 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
15930 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
15940 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
15950 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
15960 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
15970 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
15980 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
15990 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
159a0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
159b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
159c0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
159d0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
159e0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
159f0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
15a00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15a10 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
15a20 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
15a30 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61  ssert(MEMDB||pPa
15a40 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15a50 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
15a60 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ile);.  if( pPag
15a70 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
15a80 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
15a90 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
15aa0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
15ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15ac0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
15ad0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
15ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15af0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
15b00 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
15b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15b20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15b30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15b40 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
15b50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
15b60 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
15b70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
15b80 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a  ** pPager. .**.*
15b90 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47  * If the PENDING
15ba0 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68  _BYTE lies on th
15bb0 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20  e page directly 
15bc0 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
15bd0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68   the.** file, th
15be0 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  en consider this
15bf0 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68   page part of th
15c00 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20  e file too. For 
15c10 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50  example, if.** P
15c20 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62  ENDING_BYTE is b
15c30 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69  yte 4096 (the fi
15c40 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65  rst byte of page
15c50 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65   5) and the size
15c60 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
15c70 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35  is 4096 bytes, 5
15c80 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
15c90 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e  tead of 4..*/.in
15ca0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
15cb0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
15cc0 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20  Pager){.  i64 n 
15cd0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
15ce0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
15cf0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
15d00 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
15d10 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
15d20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
15d30 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
15d40 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
15d50 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
15d60 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
15d70 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
15d80 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
15d90 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  e);.    if( (pPa
15da0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15db0 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d  s).     && (rc =
15dc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
15dd0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
15de0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
15df0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15e00 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61  nRef++;.      pa
15e10 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15e20 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
15e30 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
15e40 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
15e50 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20    }.    if( n>0 
15e60 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67  && n<pPager->pag
15e70 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e  eSize ){.      n
15e80 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
15e90 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67  .      n /= pPag
15ea0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
15ec0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
15ed0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
15ee0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
15ef0 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = n;.    }.  }. 
15f00 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
15f10 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
15f20 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
15f30 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
15f40 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
15f50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
15f60 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Pgno = n;.  }.  
15f70 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69  return n;.}...#i
15f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15f90 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
15fa0 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
15fb0 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
15fc0 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
15fd0 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
15fe0 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
15ff0 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  3_free(pHist->pO
16000 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rig);.  sqlite3_
16010 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
16020 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
16030 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
16040 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
16050 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
16060 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
16070 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
16080 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
16090 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
160a0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
160b0 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
160c0 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  Pg from its hash
160d0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
160e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
160f0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
16100 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
16110 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
16120 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
16130 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
16140 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
16150 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
16160 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
16170 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
16180 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
16190 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
161a0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
161b0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
161c0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
161d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
161e0 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
161f0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
16200 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
16210 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
16220 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
16230 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
16240 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
16250 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16260 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
16270 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
16280 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
16290 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
162a0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
162b0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
162c0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
162d0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
162e0 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
162f0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
16300 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
16310 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
16320 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
16330 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
16340 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
16350 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
16360 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
16370 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
16380 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
16390 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
163a0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
163b0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
163c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
163d0 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
163e0 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
163f0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
16400 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
16410 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
16420 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
16430 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
16440 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
16450 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
16460 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
16470 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
16480 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
16490 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
164a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
164b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
164c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
164d0 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72  * Unlink from fr
164e0 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ee page list */.
164f0 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
16500 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  pPg);..  /* Unli
16510 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
16520 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
16530 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
16540 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
16550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16560 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
16570 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
16580 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
16590 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
165a0 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
165b0 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
165c0 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
165d0 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
165e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
165f0 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
16600 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
16610 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
16620 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
16630 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
16640 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
16650 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
16660 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16670 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
16680 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
16690 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
166a0 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
166b0 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
166c0 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
166d0 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
166e0 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
166f0 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
16700 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
16710 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
16720 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
16730 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
16740 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
16750 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
16760 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
16770 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
16780 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
16790 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
167a0 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
167b0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
167c0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
167d0 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
167e0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
167f0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
16800 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
16810 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
16820 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
16830 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16840 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16850 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
16860 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
16870 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
16880 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
16890 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
168a0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
168b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
168c0 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
168d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
168e0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
168f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
16900 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
16910 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
16920 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
16930 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
16940 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16950 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  ee(pPg->pData);.
16960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16970 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
16980 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
16990 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
169a0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
169b0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
169c0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
169d0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
169e0 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
169f0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
16a00 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
16a10 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
16a20 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
16a30 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
16a40 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
16a50 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
16a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16a70 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
16a80 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
16a90 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
16aa0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
16ab0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
16ac0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
16ad0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
16ae0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
16af0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
16b00 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
16b10 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
16b20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
16b30 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
16b40 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
16b50 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16b60 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
16b70 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
16b80 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
16b90 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
16ba0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
16bb0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
16bc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
16bd0 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
16be0 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
16bf0 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
16c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16c10 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
16c20 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
16c30 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
16c40 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
16c50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
16c60 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
16c70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
16c80 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
16c90 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
16ca0 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75  er ) pPager->pBu
16cb0 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79  syHandler->nBusy
16cc0 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20   = 0;.    do {. 
16cd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16ce0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
16cf0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
16d00 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
16d10 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
16d20 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
16d30 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
16d40 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
16d50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
16d70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
16d80 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
16d90 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
16da0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16db0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
16dc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
16de0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
16df0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16e00 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
16e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
16e20 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
16e30 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
16e40 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
16e50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16e60 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
16e70 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
16e80 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16e90 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
16ea0 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
16eb0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
16ec0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
16ed0 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
16ee0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
16ef0 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
16f00 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
16f10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
16f30 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16f40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16f50 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
16f60 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
16f70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
16f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16f90 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
16fa0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
16fb0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
16fc0 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
16fd0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
16fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ff0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
17010 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17020 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17030 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
17040 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
17050 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
17060 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17070 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17080 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
17090 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
170a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
170b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
170c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
170d0 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
170e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
170f0 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
17100 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
17110 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
17120 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
17130 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
17140 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
17150 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
17160 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
17170 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
17180 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
17190 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
171a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
171b0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
171c0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
171d0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
171e0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
171f0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
17200 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
17210 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
17220 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
17230 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
17240 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17250 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
17260 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
17270 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
17280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
17290 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
172a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
172b0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
172c0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
172d0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
172e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
172f0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
17300 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
17310 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
17320 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
17330 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
17340 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
17350 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
17360 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17370 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
17380 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
17390 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
173a0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
173b0 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
173c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
173d0 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c  tex *mutex = sql
173e0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
173f0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17400 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
17410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
17420 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
17430 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65  if( pPager->pPre
17440 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  v ){.      pPage
17450 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
17460 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
17470 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17480 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
17490 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  st = pPager->pNe
174a0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
174b0 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20  ( pPager->pNext 
174c0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
174d0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
174e0 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20  pPager->pPrev;. 
174f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17500 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
17510 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
17520 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
17530 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
17540 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
17550 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
17560 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
17570 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
17580 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
17590 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
175a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
175b0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
175c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
175d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
175e0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
175f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
17600 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
17610 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
17620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17630 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
17640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17650 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
17660 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
17670 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
17680 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
17690 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
176a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
176b0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
176c0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
176d0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  pInJournal);.  i
176e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
176f0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
17700 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
17710 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
17720 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
17730 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
17740 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
17750 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
17760 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
17770 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
17780 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
17790 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
177a0 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
177b0 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
177c0 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  */..  sqlite3_fr
177d0 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
177e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
177f0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
17800 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ace);.  sqlite3_
17810 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
17820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17830 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
17840 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
17850 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
17860 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
17870 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
17880 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
17890 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
178a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
178b0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
178c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
178d0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
178e0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
178f0 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
17900 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
17910 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
17920 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
17930 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
17940 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
17950 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
17960 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
17970 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
17980 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
17990 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
179a0 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
179b0 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
179c0 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
179d0 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
179e0 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
179f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
17a00 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
17a10 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
17a20 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
17a30 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
17a40 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
17a50 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
17a60 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
17a70 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
17a80 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
17a90 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
17aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
17ab0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
17ac0 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
17ad0 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
17ae0 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69 73 74 52   */.    lruListR
17af0 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20  emove(pPg);.    
17b00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
17b10 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
17b20 6e 52 65 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66  nRef++;.}.#ifdef
17b30 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17b40 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
17b50 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
17b60 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
17b70 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
17b80 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
17b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ba0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
17bb0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20    }.  }.#else.# 
17bc0 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28  define page_ref(
17bd0 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d  P)   ((P)->nRef=
17be0 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a  =0?_page_ref(P):
17bf0 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b  (void)(P)->nRef+
17c00 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  +).#endif../*.**
17c10 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
17c20 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
17c30 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
17c40 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
17c50 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
17c60 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
17c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17c80 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
17c90 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72 45 6e  *pPg){.  pagerEn
17ca0 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29  ter(pPg->pPager)
17cb0 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
17cc0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
17cd0 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
17ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
17d00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
17d10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
17d20 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
17d30 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
17d40 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
17d50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
17d60 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
17d70 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
17d80 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
17d90 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
17da0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
17db0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17dc0 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
17dd0 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
17de0 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
17df0 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
17e00 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
17e10 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
17e20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
17e30 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
17e40 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
17e50 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
17e60 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
17e70 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
17e80 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
17e90 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
17ea0 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
17eb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
17ec0 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
17ed0 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
17ee0 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
17ef0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
17f00 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
17f10 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
17f20 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
17f30 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
17f40 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
17f50 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
17f60 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
17f70 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
17f80 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
17f90 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
17fa0 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
17fb0 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
17fc0 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
17fd0 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
17fe0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
17ff0 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
18000 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
18010 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
18020 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
18030 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
18040 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
18050 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
18060 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
18070 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e  er failure, so n
18080 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
18090 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41  *.** If the IOCA
180a0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61  P_SEQUENTIAL fla
180b0 67 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65  g is set for the
180c0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
180d0 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68  a on which.** th
180e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
180f0 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e  ored, then OsSyn
18100 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
18110 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  led on the journ
18120 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74  al.** file. In t
18130 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61  his case all tha
18140 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
18150 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e   to update the n
18160 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20  Rec field in.** 
18170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
18180 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
18190 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
181a0 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
181b0 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
181c0 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
181d0 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
181e0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
181f0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
18200 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
18210 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18220 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53  ITE_OK;...  /* S
18230 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
18240 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
18250 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
18260 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
18270 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
18280 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
18290 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
182a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
182b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
182c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
182d0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
182e0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
182f0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
18300 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
18310 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
18320 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18330 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
18340 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
18350 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
18360 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
18370 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
18380 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
18390 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
183a0 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
183b0 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
183c0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
183d0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
183e0 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
183f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
18400 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
18410 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
18420 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
18430 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
18440 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
18450 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
18460 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
18470 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
18480 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
18490 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
184a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
184b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
184c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
184d0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
184e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
184f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18500 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
18510 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
18520 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
18530 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
18540 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
18550 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18560 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
18570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18580 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
18590 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
185a0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
185b0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
185c0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
185d0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
185e0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
185f0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
18600 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
18610 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
18620 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
18630 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
18640 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
18650 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
18660 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
18670 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
18680 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
18690 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
186a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
186b0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
186c0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
186d0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
186e0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
186f0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
18700 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
18710 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
18720 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
18730 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
18740 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
18750 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
18760 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
18770 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
18780 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
18790 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
187a0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
187b0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
187c0 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
187d0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
187e0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
187f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
18800 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
18810 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
18820 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
18830 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
18840 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18850 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18860 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
18870 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
18880 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
18890 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
188a0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
188b0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
188c0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
188d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
188e0 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
188f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
18900 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
18910 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
18920 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18930 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
18940 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
18950 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
18960 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
18970 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
18980 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
18990 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
189a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
189b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
189c0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
189d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
189e0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
189f0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18a00 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18a10 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18a20 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18a30 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
18a40 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
18a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18a60 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
18a70 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
18a80 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
18a90 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
18aa0 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
18ab0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
18ac0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
18ad0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
18ae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18af0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
18b10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
18b20 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
18b30 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
18b40 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
18b50 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
18b60 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
18b70 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
18b80 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
18b90 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
18ba0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
18bb0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
18bc0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18bd0 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65   }.    lruListSe
18be0 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
18bf0 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  ger);.  }..#ifnd
18c00 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
18c10 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
18c20 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
18c30 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
18c40 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
18c50 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
18c60 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
18c70 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
18c80 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
18c90 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
18ca0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
18cb0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18cc0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
18cd0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
18ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18cf0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
18d00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
18d10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75  ert( pPager->lru
18d20 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  .pFirstSynced==p
18d30 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
18d40 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
18d50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18d60 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
18d70 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
18d80 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
18d90 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
18da0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
18db0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
18dc0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
18dd0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
18de0 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
18df0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
18e00 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
18e10 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
18e20 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
18e30 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
18e40 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
18e50 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
18e60 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
18e70 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
18e80 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
18e90 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
18ea0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
18eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
18ec0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
18ed0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
18ee0 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
18ef0 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
18f00 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
18f10 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
18f20 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
18f30 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
18f40 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
18f50 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
18f60 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
18f70 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
18f80 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
18f90 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
18fa0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
18fb0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
18fc0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
18fd0 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
18fe0 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
18ff0 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
19000 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
19010 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
19020 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
19030 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
19040 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35  _BUCKET_ALLOC 25
19050 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
19060 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a  BUCKET       25.
19070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19080 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
19090 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
190a0 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64  cket = 0;.  #und
190b0 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ef N_SORT_BUCKET
190c0 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  .  #define N_SOR
190d0 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73  T_BUCKET \.   (s
190e0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
190f0 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74  ort_bucket?sqlit
19100 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19110 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55  bucket:N_SORT_BU
19120 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64  CKET_ALLOC).#end
19130 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  if.static PgHdr 
19140 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50  *sort_pagelist(P
19150 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67  gHdr *pIn){.  Pg
19160 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55  Hdr *a[N_SORT_BU
19170 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b  CKET_ALLOC], *p;
19180 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
19190 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
191a0 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
191b0 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
191c0 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
191d0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
191e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
191f0 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
19200 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
19210 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
19220 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
19230 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
19240 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
19250 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
19260 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
19270 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
19280 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
19290 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
192a0 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
192b0 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  -1 ){.      /* C
192c0 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20  overage: To get 
192d0 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64  here, there need
192e0 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54   to be 2^(N_SORT
192f0 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20  _BUCKET) .      
19300 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ** elements in t
19310 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54  he input list. T
19320 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c  his is possible,
19330 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c   but impractical
19340 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69  ..      ** Testi
19350 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  ng this line is 
19360 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f  the point of glo
19370 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20  bal variable.   
19380 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61     ** sqlite3_pa
19390 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
193a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
193b0 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
193c0 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
193d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
193e0 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
193f0 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
19400 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
19410 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
19420 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
19430 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
19440 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
19450 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
19460 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
19470 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
19480 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
19490 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
194a0 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
194b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
194c0 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
194d0 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
194e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
194f0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
19500 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
19510 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
19520 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74   PgHdr *p;.  int
19530 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
19540 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
19550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
19560 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
19570 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
19580 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
19590 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
195a0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
195b0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
195c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
195d0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
195e0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
195f0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
19600 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
19610 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
19620 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
19630 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
19640 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
19650 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
19660 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
19670 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
19680 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
19690 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
196a0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
196b0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
196c0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
196d0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
196e0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
196f0 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
19700 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
19710 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
19720 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
19730 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
19740 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
19750 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
19760 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
19770 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
19780 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
19790 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
197a0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
197b0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
197c0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
197d0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
197e0 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
197f0 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
19800 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
19810 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
19820 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
19830 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
19840 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
19850 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
19860 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
19870 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
19880 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
19890 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
198a0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
198b0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
198c0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
198d0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
198e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
198f0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
19900 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
19910 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
19920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19930 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19940 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
19950 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
19960 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  st);.  for(p=pLi
19970 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
19980 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
19990 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20   p->dirty );.   
199a0 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
199b0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73   }.  while( pLis
199c0 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
199d0 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
199e0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
199f0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
19a00 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
19a10 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
19a20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19a30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19a40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19a50 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
19a60 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
19a70 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
19a80 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger->zFilename,.
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
19ac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
19ad0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19ae0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
19af0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
19b00 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
19b10 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
19b20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
19b30 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
19b40 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
19b50 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
19b60 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
19b70 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
19b80 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
19b90 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
19ba0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
19bb0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
19bc0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
19bd0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
19be0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
19bf0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
19c00 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
19c10 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ize ){.      i64
19c20 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74   offset = (pList
19c30 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
19c40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19c50 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
19c60 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
19c70 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
19c80 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
19c90 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
19ca0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54   PAGERTRACE4("ST
19cb0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
19cc0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19cf0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70  , pList->pgno, p
19d00 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
19d10 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ist));.      IOT
19d20 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
19d30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
19d40 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  List->pgno));.  
19d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
19d70 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
19d80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
19d90 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  set);.      PAGE
19da0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
19db0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
19dc0 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
19dd0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
19de0 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rite);.      if(
19df0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
19e00 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
19e10 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
19e20 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
19e30 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
19e40 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
19e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
19e60 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
19e70 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47   else{.      PAG
19e80 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52  ERTRACE3("NOSTOR
19e90 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
19ea0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19eb0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
19ec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19ed0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19ee0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
19ef0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
19f00 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
19f10 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
19f20 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
19f30 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
19f40 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
19f50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
19f60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
19f70 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
19f80 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
19f90 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
19fa0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
19fb0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
19fc0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
19fd0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
19fe0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
19ff0 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
1a000 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1a010 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
1a020 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1a030 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1a040 7b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  {..#ifndef NDEBU
1a050 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1a060 65 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20  e sanity of the 
1a070 64 69 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20  dirty list when 
1a080 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20  we are running. 
1a090 20 2a 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67   ** in debugging
1a0a0 20 6d 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20   mode.  This is 
1a0b0 65 78 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f  expensive, so do
1a0c0 20 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69   not.  ** do thi
1a0d0 73 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  s on a normal bu
1a0e0 69 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  ild. */.  int n1
1a0f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d   = 0;.  int n2 =
1a100 20 30 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a   0;.  PgHdr *p;.
1a110 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1a120 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
1a130 65 78 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e  extAll){ if( p->
1a140 64 69 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a  dirty ) n1++; }.
1a150 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1a160 70 44 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e  pDirty; p; p=p->
1a170 70 44 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d  pDirty){ n2++; }
1a180 0a 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e  .  assert( n1==n
1a190 32 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  2 );.#endif..  r
1a1a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
1a1b0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
1a1c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1a1d0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
1a1e0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
1a1f0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
1a200 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
1a210 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1a220 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
1a230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
1a240 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
1a250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a260 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
1a270 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
1a280 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
1a290 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
1a2a0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
1a2b0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
1a2c0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
1a2d0 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
1a2e0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1a2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a300 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
1a310 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a320 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a330 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1a340 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1a350 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
1a360 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70  turn 0;.  if( !p
1a370 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1a380 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ods ) return 0;.
1a390 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73    if( !sqlite3Os
1a3a0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
1a3b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
1a3c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1a3d0 53 54 53 29 20 29 7b 0a 20 20 20 20 72 65 74 75  STS) ){.    retu
1a3e0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1a3f0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
1a400 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
1a410 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
1a420 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1a430 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
1a440 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
1a450 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a460 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1a470 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1a480 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a490 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a4a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
1a4b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
1a4c0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1a4d0 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
1a4e0 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
1a4f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a500 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
1a510 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
1a520 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
1a530 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
1a540 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
1a550 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72  ger->errCode var
1a560 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1a570 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
1a580 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
1a590 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1a5a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1a5b0 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f   *ppPg = 0;..  /
1a5c0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1a5d0 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
1a5e0 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65  ction unless the
1a5f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a 20 20   pager object.  
1a600 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
1a610 20 70 50 61 67 65 72 20 68 61 73 20 61 74 20 6c   pPager has at l
1a620 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20 70 61  east one free pa
1a630 67 65 20 28 70 61 67 65 20 77 69 74 68 20 6e 52  ge (page with nR
1a640 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a 20 20  ef==0)..  */ .  
1a650 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a  assert(!MEMDB);.
1a660 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1a670 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20  >lru.pFirst);.. 
1a680 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
1a690 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
1a6a0 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
1a6b0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
1a6c0 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
1a6d0 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
1a6e0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
1a6f0 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
1a700 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1a710 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
1a720 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
1a730 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
1a740 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1a750 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
1a760 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1a770 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
1a780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a790 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
1a7a0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
1a7b0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
1a7c0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
1a7d0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
1a7e0 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
1a7f0 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
1a800 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
1a810 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a820 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 63  st){.    int iDc
1a830 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
1a840 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a850 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
1a860 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
1a870 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1a880 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1a890 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1a8a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1a8b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1a8c0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1a8d0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1a8e0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
1a8f0 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
1a900 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
1a910 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
1a920 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
1a930 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1a940 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
1a950 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
1a960 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
1a970 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  al.      ** head
1a980 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
1a990 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
1a9a0 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
1a9b0 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  t have.      ** 
1a9c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1a9d0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1a9e0 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
1a9f0 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20  e header is.    
1aa00 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
1aa10 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
1aa20 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
1aa30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
1aa40 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1aa50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1aa60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1aa70 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  > 0 );.      ass
1aa80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1aa90 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1aaa0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1aab0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1aac0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
1aad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1aae0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1aaf0 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70     }.    pPg = p
1ab00 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1ab10 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
1ab20 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
1ab30 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
1ab40 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
1ab50 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
1ab60 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
1ab70 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1ab80 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
1ab90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1aba0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
1abb0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
1abc0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
1abd0 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
1abe0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1abf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1ac00 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
1ac10 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   );.    pPg->dir
1ac20 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1ac30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ac40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ac50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1ac60 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
1ac70 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
1ac80 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1ac90 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
1aca0 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
1acb0 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
1acc0 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
1acd0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1ace0 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
1acf0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
1ad00 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1ad10 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
1ad20 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
1ad30 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1ad40 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
1ad50 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
1ad60 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
1ad70 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
1ad80 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
1ad90 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
1ada0 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
1adb0 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
1adc0 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
1add0 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
1ade0 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
1adf0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
1ae00 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
1ae10 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
1ae20 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
1ae30 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
1ae40 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
1ae50 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
1ae60 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1ae70 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ck ){.    IOTRAC
1ae80 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42  E(("ALWAYS_ROLLB
1ae90 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  ACK %p\n", pPage
1aea0 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r)).    pPager->
1aeb0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1aec0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
1aed0 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
1aee0 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
1aef0 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
1af00 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
1af10 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
1af20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1af30 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70  gno==0 );..  *pp
1af40 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
1af50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1af60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1af70 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1af80 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68  AGEMENT./*.** Th
1af90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1afa0 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
1afb0 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
1afc0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
1afd0 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
1afe0 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
1aff0 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
1b000 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
1b010 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
1b020 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
1b030 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
1b040 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64  sqlite3_free()ed
1b050 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20  ..**.** nReq is 
1b060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b070 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
1b080 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69  quired. Once thi
1b090 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65  s much has.** be
1b0a0 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  en released, the
1b0b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b0c0 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  s. The return va
1b0d0 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c  lue is the total
1b0e0 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62   number .** of b
1b0f0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
1b100 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eleased..*/.int 
1b110 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
1b120 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
1b130 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65  eq){.  int nRele
1b140 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ased = 0;       
1b150 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
1b160 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73  emory released s
1b170 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c 69 74  o far */.  sqlit
1b180 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
1b190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 45         /* The ME
1b1a0 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20 50 61  M2 mutex */.  Pa
1b1b0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
1b1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1b1d0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1b1e0 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79 48 61  gers */.  BusyHa
1b1f0 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75 73 79  ndler *savedBusy
1b200 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 63  ;     /* Saved c
1b210 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73 79 20  opy of the busy 
1b220 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  handler */.  int
1b230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b240 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74  ..  /* Acquire t
1b250 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  he memory-manage
1b260 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a  ment mutex.  */.
1b270 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
1b280 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1b290 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1b2a0 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74  C_MEM2);.  sqlit
1b2b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
1b2c0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67  utex);..  /* Sig
1b2d0 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65  nal all database
1b2e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1b2f0 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  t memory managem
1b300 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74  ent wants.  ** t
1b310 6f 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f  o have access to
1b320 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a   the pagers..  *
1b330 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73  /.  for(pPager=s
1b340 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
1b350 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d   pPager; pPager=
1b360 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
1b370 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e       pPager->iIn
1b380 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a  UseMM = 1;.  }..
1b390 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1b3a0 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c  ITE_OK && (nReq<
1b3b0 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e  0 || nReleased<n
1b3c0 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64  Req) ){.    PgHd
1b3d0 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64  r *pPg;.    PgHd
1b3e0 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a  r *pRecycled;. .
1b3f0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69      /* Try to fi
1b400 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
1b410 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  ycle that does n
1b420 6f 74 20 72 65 71 75 69 72 65 20 61 20 73 79 6e  ot require a syn
1b430 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74  c(). If.    ** t
1b440 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  his is not possi
1b450 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68  ble, find one th
1b460 61 74 20 64 6f 65 73 20 72 65 71 75 69 72 65 20  at does require 
1b470 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f  a sync()..    */
1b480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1b490 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
1b4a0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1b4b0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1b4c0 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20  _LRU));.    pPg 
1b4d0 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  = sqlite3LruPage
1b4e0 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
1b4f0 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  d;.    while( pP
1b500 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53  g && (pPg->needS
1b510 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  ync || pPg->pPag
1b520 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b  er->iInUseDB) ){
1b530 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
1b540 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20  ->gfree.pNext;. 
1b550 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
1b560 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d  g ){.      pPg =
1b570 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
1b580 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20  ist.pFirst;.    
1b590 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20    while( pPg && 
1b5a0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e  pPg->pPager->iIn
1b5b0 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20  UseDB ){.       
1b5c0 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65   pPg = pPg->gfre
1b5d0 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  e.pNext;.      }
1b5e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b5f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
1b600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1b610 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1b620 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20  STATIC_LRU));.. 
1b630 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c     /* If pPg==0,
1b640 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20   then the block 
1b650 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64  above has failed
1b660 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1b670 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c  to.    ** recycl
1b680 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1b690 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e  return early - n
1b6a0 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79  o further memory
1b6b0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
1b6c0 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f  released..    */
1b6d0 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20  .    if( !pPg ) 
1b6e0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67  break;..    pPag
1b6f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1b700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50  ;.    assert(!pP
1b710 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70  g->needSync || p
1b720 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  Pg==pPager->lru.
1b730 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73  pFirst);.    ass
1b740 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e  ert(pPg->needSyn
1b750 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72  c || pPg==pPager
1b760 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1b770 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65  ed);.  .    save
1b780 64 42 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e  dBusy = pPager->
1b790 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  pBusyHandler;.  
1b7a0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
1b7b0 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20  andler = 0;.    
1b7c0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
1b7d0 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52 65 63  le(pPager, &pRec
1b7e0 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67  ycled);.    pPag
1b7f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1b800 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20   = savedBusy;.  
1b810 20 20 61 73 73 65 72 74 28 70 52 65 63 79 63 6c    assert(pRecycl
1b820 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53  ed==pPg || rc!=S
1b830 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69  QLITE_OK);.    i
1b840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b850 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27   ){.      /* We'
1b860 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20  ve found a page 
1b870 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73  to free. At this
1b880 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20   point the page 
1b890 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20  has been .      
1b8a0 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ** removed from 
1b8b0 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61  the page hash-ta
1b8c0 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61  ble, free-list a
1b8d0 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a  nd synced-list .
1b8e0 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74        ** (pFirst
1b8f0 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73  Synced). It is s
1b900 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20  till in the all 
1b910 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73  pages (pAll) lis
1b920 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d  t. .      ** Rem
1b930 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
1b940 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
1b950 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  eing..      **. 
1b960 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68       ** Todo: Ch
1b970 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53  eck the Pager.pS
1b980 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65  tmt list to make
1b990 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b   sure this is Ok
1b9a0 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70  . It .      ** p
1b9b0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
1b9c0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1b9d0 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20    PgHdr *pTmp;. 
1b9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1b9f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
1ba00 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  g==pPager->pAll 
1ba10 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  ){.         pPag
1ba20 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e  er->pAll = pPg->
1ba30 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
1ba40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1ba50 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d  or( pTmp=pPager-
1ba60 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65  >pAll; pTmp->pNe
1ba70 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70  xtAll!=pPg; pTmp
1ba80 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20  =pTmp->pNextAll 
1ba90 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54 6d 70  ){}.        pTmp
1baa0 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
1bab0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1bac0 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61    }.      nRelea
1bad0 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20  sed += (.       
1bae0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20     sizeof(*pPg) 
1baf0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1bb00 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73  ze.          + s
1bb10 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
1bb20 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
1bb30 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
1bb40 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
1bb50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1bb60 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
1bb70 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61   %p %d *\n", pPa
1bb80 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1bb90 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1bba0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1bbb0 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
1bbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1bbd0 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  ee(pPg->pData);.
1bbe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1bbf0 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
1bc00 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
1bc10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
1bc30 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
1bc40 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1bc50 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20  ase file or .   
1bc60 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
1bc70 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
1bc80 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
1bc90 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
1bca0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  he .      ** cal
1bcb0 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ler of this func
1bcc0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73  tion. Instead, s
1bcd0 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72  et the Pager.err
1bce0 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20  Code variable.. 
1bcf0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
1bd00 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
1bd10 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
1bd20 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
1bd30 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20   case .      ** 
1bd40 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
1bd50 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
1bd60 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
1bd70 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
1bd80 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1bd90 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
1bda0 20 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53      (rc&0xff)==S
1bdb0 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
1bdc0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
1bdd0 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
1bde0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1bdf0 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b 0a 20  _BUSY.      );. 
1be00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1be10 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1be20 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1be30 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
1be40 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1be50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
1be60 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  ar the memory ma
1be70 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61  nagement flags a
1be80 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d  nd release the m
1be90 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  utex.  */.  for(
1bea0 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61  pPager=sqlite3Pa
1beb0 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b  gerList; pPager;
1bec0 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
1bed0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61  pNext){.     pPa
1bee0 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
1bef0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1bf00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
1bf10 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ex);..  /* Retur
1bf20 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1bf30 62 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20  bytes released. 
1bf40 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   */.  return nRe
1bf50 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
1bf60 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1bf70 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1bf80 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ENT */../*.** Re
1bf90 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
1bfa0 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  f page pPg out o
1bfb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1bfc0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1bfd0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61  nt readDbPage(Pa
1bfe0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1bff0 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  dr *pPg, Pgno pg
1c000 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
1c010 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61   i64 offset;.  a
1c020 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
1c030 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
1c040 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c050 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
1c060 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
1c070 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c090 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c0a0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66  T_READ;.  }.  of
1c0b0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c0c0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c0d0 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
1c0e0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1c0f0 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
1c100 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1c110 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1c120 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  fset);.  PAGER_I
1c130 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1c140 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1c150 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1c160 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1c170 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1c180 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1c190 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70   pgno));.  if( p
1c1a0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65  gno==1 ){.    me
1c1b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c1c0 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
1c1d0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
1c1e0 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20  Pg))[24],.      
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
1c220 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c230 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43  s));.  }.  CODEC
1c240 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  1(pPager, PGHDR_
1c250 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1c260 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50  g->pgno, 3);.  P
1c270 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43  AGERTRACE4("FETC
1c280 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1c290 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1c2a0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1c2b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1c2c0 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67  >pgno, pager_pag
1c2d0 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72  ehash(pPg));.  r
1c2e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1c2f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c300 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1c310 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64  btain the shared
1c320 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62   lock required b
1c330 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61  efore.** data ma
1c340 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  y be read from t
1c350 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
1c360 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  If the shared lo
1c370 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ck has already.*
1c380 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  * been obtained,
1c390 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1c3a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1c3b0 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
1c3c0 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  er obtaining the
1c3d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66   shared lock (if
1c3e0 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73   required), this
1c3f0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65   function.** che
1c400 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  cks for a hot-jo
1c410 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f  urnal file. If o
1c420 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20  ne is found, an 
1c430 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
1c440 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d  ck.** is perform
1c450 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
1c460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c470 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
1c480 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1c490 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c4a0 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74 20  OK;.  int isHot 
1c4b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 0;..  /* If th
1c4c0 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  is database is o
1c4d0 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73  pened for exclus
1c4e0 69 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20  ive access, has 
1c4f0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1c500 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65    ** page refere
1c510 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nces and is in a
1c520 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
1c530 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e 63 65  ow is the chance
1c540 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74   to clear.  ** t
1c550 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72  he error. Discar
1c560 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
1c570 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
1c580 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a  e and treat any.
1c590 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61    ** open journa
1c5a0 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d  l file as a hot-
1c5b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
1c5c0 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
1c5d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1c5e0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  ode && pPager->n
1c5f0 52 65 66 3d 3d 30 20 26 26 20 70 50 61 67 65 72  Ref==0 && pPager
1c600 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1c610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c620 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1c630 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20    isHot = 1;.   
1c640 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73   }.    pager_res
1c650 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1c660 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1c670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1c680 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
1c690 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
1c6a0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
1c6b0 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
1c6c0 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
1c6d0 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
1c6e0 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
1c6f0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c700 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
1c710 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
1c720 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
1c730 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
1c740 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
1c750 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1c760 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
1c770 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
1c780 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
1c790 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1c7a0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
1c7b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1c7c0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
1c7d0 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 73 71   isHot ){.    sq
1c7e0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1c7f0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1c800 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
1c810 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c820 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1c830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
1c840 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
1c850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c860 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1c870 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
1c880 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
1c890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c8a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c8b0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1c8c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1c8d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c8e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c8f0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1c900 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
1c910 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
1c920 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
1c930 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
1c940 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
1c950 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
1c960 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1c970 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
1c980 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
1c990 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
1c9a0 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
1c9b0 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74        if( hasHot
1c9c0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
1c9d0 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  || isHot ){.    
1c9e0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
1c9f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1ca00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ca10 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
1ca20 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a   it is.        *
1ca30 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
1ca40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ca50 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
1ca60 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
1ca70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58  he.        ** EX
1ca80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
1ca90 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
1caa0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
1cab0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
1cac0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1cad0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
1cae0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
1caf0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
1cb00 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
1cb10 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
1cb20 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
1cb30 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
1cb40 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
1cb50 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a         ** back..
1cb60 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
1cb70 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
1cb80 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
1cb90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
1cba0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
1cbb0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
1cbc0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
1cbd0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
1cbe0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
1cbf0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
1cc00 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
1cc10 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
1cc20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1cc30 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
1cc40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1cc50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1cc60 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  <EXCLUSIVE_LOCK 
1cc70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1cc80 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1cc90 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
1cca0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
1ccb0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1ccc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ccd0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
1cce0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1ccf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1cd00 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1cd10 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1cd20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cd30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1cd40 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1cd50 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  .        }. .   
1cd60 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
1cd70 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
1cd80 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
1cd90 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
1cda0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  f.        ** we 
1cdb0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
1cdc0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1cdd0 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  ile. .        **
1cde0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
1cdf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1ce00 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1ce10 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
1ce20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
1ce30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1ce40 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73  never open unles
1ce50 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
1ce60 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20  ase file holds. 
1ce70 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74         ** a writ
1ce80 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65  e lock, so there
1ce90 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68   is never any ch
1cea0 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ance of two or m
1ceb0 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ore.        ** p
1cec0 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
1ced0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
1cee0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
1cef0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1cf00 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    ** Open the jo
1cf10 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
1cf20 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
1cf30 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
1cf40 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  .        ** excl
1cf50 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
1cf60 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1cf70 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
1cf80 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
1cf90 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
1cfa0 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
1cfb0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
1cfc0 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
1cfd0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1cfe0 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61   OsTruncate() ca
1cff0 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75  ll used in exclu
1d000 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
1d010 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20   also requires. 
1d020 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64         ** a read
1d030 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
1d040 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
1d050 20 20 20 20 20 20 20 69 66 28 20 21 69 73 48 6f         if( !isHo
1d060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
1d070 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
1d090 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1d0a0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1d0b0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
1d0c0 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a  CESS_EXISTS) ){.
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1d0e0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
1d0f0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
1d100 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1d110 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1d120 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
1d130 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d140 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1d150 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
1d160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d170 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1d180 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1d190 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
1d1a0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
1d1b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1d1c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1d1d0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1d1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1d1f0 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f  if( fout&SQLITE_
1d200 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
1d210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1d220 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1d240 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1d250 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
1d260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d280 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2a0 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
1d2b0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1d2c0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 72         switch( r
1d2d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1d2e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
1d2f0 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
1d300 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
1d310 52 5f 55 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  R_UNLOCK:.      
1d320 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1d330 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a 20  E_IOERR_NOMEM:. 
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1d350 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d360 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1d370 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d380 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1d390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d3a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
1d3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d3c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
1d3d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1d3e0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
1d3f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d400 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
1d410 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
1d420 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
1d430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d440 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
1d450 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
1d460 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
1d470 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
1d480 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
1d490 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
1d4a0 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
1d4b0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
1d4c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d4d0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1d4e0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
1d4f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d510 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
1d520 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1d530 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
1d540 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d550 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1d560 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
1d570 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
1d580 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1d590 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
1d5a0 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
1d5b0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1d5c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
1d5d0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
1d5e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1d5f0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
1d600 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
1d610 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d620 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
1d630 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
1d640 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
1d650 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
1d660 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1d670 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
1d680 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1d690 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
1d6a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1d6b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20  .        ** has 
1d6c0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
1d6d0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1d6e0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
1d6f0 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  sh the.        *
1d700 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20  * cache..       
1d710 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   **.        ** D
1d720 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
1d730 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
1d740 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
1d750 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
1d760 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
1d770 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
1d780 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
1d790 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
1d7a0 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
1d7b0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
1d7c0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
1d7d0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
1d7e0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
1d7f0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
1d800 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
1d810 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
1d820 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
1d830 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64          ** a cod
1d840 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
1d850 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
1d860 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
1d870 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d880 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
1d890 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
1d8a0 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  be .        ** d
1d8b0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
1d8c0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
1d8d0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
1d8e0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
1d8f0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
1d900 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
1d910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d920 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
1d930 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
1d940 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
1d950 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1d960 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1d970 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
1d980 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1d990 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
1d9a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1d9b0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
1d9c0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1d9d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
1d9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  {.          IOTR
1d9f0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
1da00 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
1da10 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1da20 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
1da30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1da40 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
1da50 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1da60 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
1da70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
1da80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1da90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1daa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1dab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1dac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
1dad0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
1dae0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
1daf0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1db00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1db10 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
1db20 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1db30 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1db40 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
1db50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1db60 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1db70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1db80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1db90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
1dba0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1dbb0 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
1dbc0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1dbd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1dbe0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1dbf0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1dc00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1dc10 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
1dc20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1dc30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1dc40 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
1dc50 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
1dc60 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
1dc70 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
1dc80 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
1dc90 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
1dca0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
1dcb0 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
1dcc0 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
1dcd0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1dce0 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
1dcf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
1dd00 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
1dd10 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
1dd20 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
1dd30 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1dd40 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
1dd50 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
1dd60 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
1dd70 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1dd80 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
1dd90 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
1dda0 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
1ddb0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
1ddc0 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
1ddd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dde0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
1ddf0 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
1de00 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
1de10 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
1de20 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
1de30 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
1de40 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
1de50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1de60 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
1de70 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
1de80 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
1de90 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
1dea0 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
1deb0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1dec0 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
1ded0 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
1dee0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1def0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1df00 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1df10 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
1df20 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
1df30 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
1df40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
1df50 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
1df60 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
1df70 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
1df80 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
1df90 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
1dfa0 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
1dfb0 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
1dfc0 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
1dfd0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
1dfe0 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
1dff0 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
1e000 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
1e010 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
1e020 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
1e030 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
1e040 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
1e050 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
1e060 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
1e070 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
1e080 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
1e090 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
1e0a0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1e0b0 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
1e0c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e0d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
1e0e0 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20  nt nByteHdr;..  
1e0f0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
1e100 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
1e110 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
1e120 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
1e130 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a  * above are met:
1e140 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1e150 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
1e160 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61  mxPage.   || pPa
1e170 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
1e180 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a  =0 .   || MEMDB.
1e190 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c     || (pPager->l
1e1a0 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
1e1b0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f  =0 && pPager->do
1e1c0 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20  NotSync).  ){.  
1e1d0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
1e1e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1e1f0 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48  Page>=pPager->nH
1e200 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ash ){.      pag
1e210 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
1e220 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
1e230 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
1e240 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
1e250 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
1e260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1e270 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
1e280 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e290 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1e2a0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1e2b0 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1e2c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e2d0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1e2e0 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20 3d  ;.    nByteHdr =
1e2f0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
1e300 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
1e310 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
1e320 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
1e330 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
1e340 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  ory);.    pPg = 
1e350 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1e360 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20 20  nByteHdr );.    
1e370 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
1e380 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   pData = sqlite3
1e390 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
1e3a0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1e3b0 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20     if( pData==0 
1e3c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e3d0 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
1e3e0 20 20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20        pPg = 0;. 
1e3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e400 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1e410 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1e420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1e430 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1e440 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1e450 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1e460 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
1e470 70 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64 72  pPg, 0, nByteHdr
1e480 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74  );.    pPg->pDat
1e490 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70  a = pData;.    p
1e4a0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
1e4b0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
1e4c0 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
1e4d0 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  >pAll;.    pPage
1e4e0 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
1e4f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
1e500 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1e510 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
1e520 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
1e530 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
1e540 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
1e550 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1e560 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20  ager, &pPg);.   
1e570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e580 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
1e590 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1e5a0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
1e5b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1e5d0 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1e5e0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1e5f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e600 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
1e610 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
1e620 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
1e630 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
1e640 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
1e650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e660 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e670 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
1e680 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
1e690 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
1e6a0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
1e6b0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1e6c0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
1e6d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
1e6e0 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
1e6f0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
1e700 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
1e710 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1e720 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
1e730 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
1e740 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
1e750 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
1e760 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
1e770 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
1e780 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
1e790 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1e7a0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1e7b0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
1e7c0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
1e7d0 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
1e7e0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1e7f0 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
1e800 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1e810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
1e830 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1e840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1e870 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e880 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1e890 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
1e8a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
1e8b0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
1e8c0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
1e8d0 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
1e8e0 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
1e8f0 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
1e900 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
1e910 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
1e920 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e930 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1e940 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
1e950 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
1e960 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1e970 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
1e980 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1e990 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
1e9a0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
1e9b0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
1e9c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
1e9d0 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
1e9e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
1e9f0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
1ea00 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
1ea10 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
1ea20 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
1ea30 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
1ea40 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
1ea50 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
1ea60 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
1ea70 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
1ea80 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
1ea90 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
1eaa0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
1eab0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
1eac0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
1ead0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1eae0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
1eaf0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1eb00 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1eb10 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
1eb20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
1eb30 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
1eb40 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
1eb50 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
1eb60 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1eb70 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
1eb80 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1eb90 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
1eba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
1ebb0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
1ebc0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
1ebd0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
1ebe0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
1ebf0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
1ec00 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
1ec10 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1ec20 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
1ec30 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
1ec40 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
1ec50 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
1ec60 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
1ec70 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
1ec80 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
1ec90 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
1eca0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
1ecb0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
1ecc0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1ecd0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
1ece0 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
1ecf0 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1ed00 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1ed10 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1ed20 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1ed30 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1ed40 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1ed50 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1ed60 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1ed70 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1ed80 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1ed90 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1eda0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1edb0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1edc0 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1edd0 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1ede0 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1edf0 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1ee00 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1ee10 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1ee20 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1ee30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ee40 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1ee50 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1ee60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ee70 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1ee80 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1ee90 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1eea0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1eeb0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1eec0 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1eed0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1eee0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
1eef0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
1ef00 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1ef10 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1ef20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1ef30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1ef40 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1ef50 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1ef60 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1ef70 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1ef80 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1ef90 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1efa0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1efb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1efc0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1efd0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1efe0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1eff0 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1f000 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1f010 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1f020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f030 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1f040 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1f050 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1f060 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1f070 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1f080 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1f090 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1f0a0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1f0b0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1f0c0 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1f0d0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1f0e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1f0f0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1f100 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1f110 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1f120 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f140 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1f150 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1f160 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1f170 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1f180 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1f190 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1f1a0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1f1b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f1c0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1f1d0 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
1f1e0 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
1f1f0 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
1f200 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
1f210 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
1f220 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
1f230 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
1f240 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1f250 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
1f260 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1f270 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1f280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f290 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f2a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1f2b0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1f2c0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70  R_UNLOCK );..  p
1f2d0 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
1f2e0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1f2f0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
1f300 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1f310 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
1f320 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
1f330 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
1f340 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b  nMax;.    int h;
1f350 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1f360 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
1f370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c      rc = pagerAl
1f380 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65  locatePage(pPage
1f390 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1f3a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f3b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f3c0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rc;.    }..    p
1f3d0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1f3e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
1f3f0 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67  MDB || pgno>pPag
1f400 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a  er->stmtSize );.
1f410 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1f420 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
1f430 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1f440 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
1f450 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
1f460 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61  ync = 0;..    ma
1f470 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
1f480 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
1f490 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ..    pPager->nR
1f4a0 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ef++;.    if( pP
1f4b0 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
1f4c0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
1f4d0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
1f4e0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
1f4f0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
1f500 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d      }.    nMax =
1f510 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1f520 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1f530 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f540 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1f550 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1f560 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c  rCode;.      sql
1f570 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f580 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
1f590 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1f5a0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
1f5b0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
1f5c0 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
1f5d0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1f5e0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
1f5f0 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
1f600 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
1f610 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
1f620 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
1f630 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
1f640 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26  || (noContent &&
1f650 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
1f660 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20  Rollback) ){.   
1f670 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
1f680 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1f690 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f6a0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f6b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f6c0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
1f6d0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  }.      memset(P
1f6e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1f6f0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
1f700 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
1f710 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e  Pg->needRead = n
1f720 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
1f730 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1f740 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ack;.      IOTRA
1f750 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
1f760 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1f770 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1f780 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1f790 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67  Page(pPager, pPg
1f7a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
1f7b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f7c0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1f7d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1f7e0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
1f7f0 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
1f800 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f810 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1f820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f830 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1f840 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1f850 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
1f860 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1f870 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
1f880 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
1f890 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
1f8a0 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
1f8b0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
1f8c0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1f8d0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
1f8e0 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
1f8f0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1f900 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1f910 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
1f920 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1f930 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1f940 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
1f950 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
1f960 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1f970 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1f980 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1f990 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
1f9a0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1f9b0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1f9c0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
1f9d0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1f9e0 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
1f9f0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1fa00 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1fa10 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
1fa20 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  =1);.    PAGER_I
1fa30 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
1fa40 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f  );.    if( !noCo
1fa50 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
1fa60 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1fa70 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20  ntent(pPg);.    
1fa80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fa90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1faa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fab0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
1fac0 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
1fad0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1fae0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1faf0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
1fb00 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1fb10 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1fb20 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1fb30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fb40 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1fb60 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1fb70 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1fb80 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1fb90 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1fba0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1fbb0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1fbc0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1fbd0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1fbe0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1fbf0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1fc00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67  .  int rc;.  pag
1fc10 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1fc20 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71  .  rc = pagerAcq
1fc30 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
1fc40 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
1fc50 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65  tent);.  pagerLe
1fc60 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
1fc70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1fc80 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1fc90 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
1fca0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
1fcb0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
1fcc0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
1fcd0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
1fce0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1fcf0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
1fd00 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
1fd10 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
1fd20 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
1fd30 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
1fd40 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
1fd50 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1fd60 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
1fd70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
1fd80 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
1fd90 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
1fda0 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
1fdb0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
1fdc0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1fdd0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
1fde0 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
1fdf0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
1fe00 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
1fe10 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
1fe20 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
1fe30 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
1fe40 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
1fe50 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
1fe60 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
1fe70 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1fe80 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1fe90 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  g = 0;..  assert
1fea0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1feb0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
1fec0 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65   );..  pagerEnte
1fed0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
1fee0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1fef0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1ff00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1ff10 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61  ger->pAll || pPa
1ff20 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1ff30 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  de );.  }else if
1ff40 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ff50 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1ff60 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1ff70 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  L ){.    /* Do n
1ff80 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73  othing */.  }els
1ff90 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61 67  e if( (pPg = pag
1ffa0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1ffb0 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20  , pgno))!=0 ){. 
1ffc0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
1ffd0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
1ffe0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
1fff0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
20000 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
20010 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
20020 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20030 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
20040 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
20050 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
20060 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
20070 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
20080 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
20090 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
200a0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
200b0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
200c0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
200d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
200e0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
200f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
20100 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
20110 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
20120 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
20130 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
20140 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
20150 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
20160 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge.  */.  assert
20170 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
20180 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20190 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50  g->pPager);.  pP
201a0 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48  g->nRef--;..  CH
201b0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
201c0 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
201d0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
201e0 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
201f0 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
20200 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
20210 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
20220 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
20230 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
20240 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20  >nRef==0 ){..   
20250 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29   lruListAdd(pPg)
20260 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
20270 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
20280 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
20290 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20  Destructor(pPg, 
202a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
202b0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
202c0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
202d0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
202e0 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
202f0 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
20300 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
20310 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
20320 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
20330 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
20340 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
20350 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
20360 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70  ->nRef==0 && (!p
20370 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20380 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
20390 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b  journalOff>0) ){
203a0 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  .      pagerUnlo
203b0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
203c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
203d0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
203e0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
203f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20400 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
20410 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
20420 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
20430 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
20440 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
20450 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20460 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20470 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
20480 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
20490 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
204a0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
204b0 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
204c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
204d0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
204e0 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
204f0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
20500 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
20510 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
20520 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
20530 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
20540 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
20550 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c  ->pVfs;.  int fl
20560 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
20570 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
20580 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20590 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  VE|SQLITE_OPEN_C
205a0 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72  REATE);..  int r
205b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
205c0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
205d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
205e0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
205f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
20610 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20620 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
20630 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
20640 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20650 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
20660 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20670 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
20680 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20690 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
206a0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
206b0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
206c0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
206d0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
206e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
206f0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
20700 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20710 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
20720 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
20730 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
20740 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
20750 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67  File ){.    flag
20760 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
20770 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
20780 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
20790 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c  _JOURNAL);.  }el
207a0 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  se{.    flags |=
207b0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
207c0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d  IN_JOURNAL);.  }
207d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
207e0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
207f0 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  TE.  rc = sqlite
20800 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
20810 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
20820 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
20830 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
20840 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
20850 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73  Pager).  );.#els
20860 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
20870 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
20880 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
20890 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
208a0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
208b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
208c0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
208d0 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
208e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
208f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
20900 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
20910 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
20920 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
20930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20940 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
20950 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
20960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
20970 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
20980 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20990 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  0);.    }.    go
209a0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
209b0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
209c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
209d0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
209e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
209f0 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
20a00 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
20a10 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
20a20 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
20a30 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
20a40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20a50 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
20a60 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
20a70 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
20a80 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20a90 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
20aa0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20ab0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20ac0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
20ad0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
20ae0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
20af0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
20b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20b10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20b20 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
20b30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
20b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20b50 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20b60 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
20b70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
20b80 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
20b90 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20ba0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
20bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20bc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
20bd0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
20be0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20bf0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
20c00 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
20c10 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
20c20 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
20c30 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
20c40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
20c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20c60 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
20c70 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
20c80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
20c90 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
20ca0 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
20cb0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
20cc0 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
20cd0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20ce0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
20cf0 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  o() is called..*
20d00 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20d10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73  gerRollback() is
20d20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
20d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
20d40 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
20d50 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
20d60 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63  agerUnref() is c
20d70 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
20d80 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
20d90 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
20da0 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
20db0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20dc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
20dd0 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
20de0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
20df0 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
20e00 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
20e10 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
20e20 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
20e30 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
20e40 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
20e50 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
20e60 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
20e70 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
20e80 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
20e90 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
20ea0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
20eb0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
20ec0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
20ed0 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
20ee0 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
20ef0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
20f00 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
20f10 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
20f20 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
20f30 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
20f40 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
20f50 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
20f60 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
20f70 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
20f80 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
20f90 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
20fa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20fb0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
20fc0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
20fd0 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
20fe0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
20ff0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
21000 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
21010 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
21020 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
21030 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
21040 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46  op..**.** If exF
21050 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20  lag is true, go 
21060 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e  ahead and get an
21070 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
21080 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  on the file.** i
21090 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65  mmediately inste
210a0 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e  ad of waiting un
210b0 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c  til we try to fl
210c0 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
210d0 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73  The.** exFlag is
210e0 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72   ignored if a tr
210f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
21100 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  eady active..*/.
21110 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21120 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50  Begin(DbPage *pP
21130 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  g, int exFlag){.
21140 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21150 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
21160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21170 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  _OK;.  pagerEnte
21180 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
21190 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
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 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
211c0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
211d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
211e0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
211f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
21200 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21210 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
21220 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
21230 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
21240 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
21250 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
21260 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
21270 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
21280 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21290 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
212a0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
212b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
212c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
212d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
212e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
212f0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
21300 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
21310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21320 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
21330 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
21340 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
21350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21360 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21380 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
21390 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
213a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
213b0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
213c0 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
213d0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
213e0 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
213f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21400 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66  ager));.      if
21410 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
21420 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
21430 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
21440 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21450 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
21460 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
21470 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
21480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21490 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  pen && pPager->j
214a0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
214b0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
214c0 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
214d0 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
214e0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
214f0 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
21500 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
21510 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
21520 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
21530 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
21540 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
21550 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
21560 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
21570 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
21580 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
21590 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64  en and truncated
215a0 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20   to 0 bytes..   
215b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
215c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
215d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
215e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
215f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
21600 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21610 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
21620 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21630 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
21640 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
21650 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
21660 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
21670 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
21680 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
21690 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65  Size );.    page
216a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
216b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
216c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >pInJournal ){. 
216d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
216e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
216f0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
21700 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
21710 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
21720 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
21730 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
21740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21750 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
21760 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
21770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21780 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
21790 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  _OK );.  pagerLe
217a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
217b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
217c0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
217d0 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
217e0 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
217f0 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
21800 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
21810 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
21820 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
21830 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
21840 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
21850 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21860 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21870 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
21880 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
21890 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
218a0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
218b0 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
218c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
218d0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
218e0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
218f0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
21900 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
21910 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
21920 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
21930 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
21940 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
21950 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
21960 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
21970 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
21980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
21990 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
219a0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
219b0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
219c0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
219d0 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
219e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
219f0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70  ( pPg->pDirty->p
21a00 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20 29  PrevDirty==pPg )
21a10 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  ;.      pPg->pDi
21a20 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
21a30 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
21a40 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
21a50 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21a60 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21a70 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
21a80 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29  y->pDirty==pPg )
21a90 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
21aa0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
21ab0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
21ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21ad0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
21ae0 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  ger->pDirty==pPg
21af0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
21b00 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
21b10 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
21b20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
21b30 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
21b40 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
21b50 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
21b60 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
21b70 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
21b80 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
21b90 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
21ba0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
21bb0 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
21bc0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
21bd0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
21be0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
21bf0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
21c00 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
21c10 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
21c20 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
21c30 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
21c40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21c50 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
21c60 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
21c70 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
21c80 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
21c90 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
21ca0 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
21cb0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
21cc0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
21cd0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
21ce0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
21cf0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
21d00 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
21d10 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
21d20 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
21d30 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
21d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
21d50 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
21d60 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
21d70 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
21d80 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
21d90 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
21da0 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
21db0 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
21dc0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
21dd0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
21de0 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
21df0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
21e00 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
21e10 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
21e20 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
21e30 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  or sqlite3PagerR
21e40 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
21e50 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  reset..*/.static
21e60 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
21e70 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
21e80 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47  void *pData = PG
21e90 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
21ea0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
21eb0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
21ec0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21ed0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
21ee0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
21ef0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
21f00 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
21f10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21f20 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
21f30 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
21f40 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
21f50 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
21f60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
21f70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
21f80 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
21f90 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  E(pPg);..  /* If
21fa0 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70   this page was p
21fb0 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
21fc0 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
21fd0 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==1, that means
21fe0 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20  .  ** we didn't 
21ff0 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74  really read in t
22000 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22010 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61  e page.  This ca
22020 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66  n happen.  ** (f
22030 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e  or example) when
22040 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
22050 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
22060 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20  freelist.  But. 
22070 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28   ** now we are (
22080 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20  perhaps) moving 
22090 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20  the page off of 
220a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72  the freelist for
220b0 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20  .  ** reuse and 
220c0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
220d0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
220e0 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e  tent so that con
220f0 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65  tent.  ** can be
22100 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
22110 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
22120 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64    So do the read
22130 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69   at this.  ** ti
22140 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  me..  */.  rc = 
22150 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
22160 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63  t(pPg);.  if( rc
22170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22180 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  c;.  }..  /* Mar
22190 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
221a0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
221b0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
221c0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
221d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
221e0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
221f0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
22200 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
22210 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
22220 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61  inJournal && (pa
22230 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
22240 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  g) || pPager->st
22250 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
22260 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22270 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
22280 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
22290 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
222a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
222b0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
222c0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
222d0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
222e0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
222f0 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
22300 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
22310 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
22320 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
22330 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
22340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22350 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
22360 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
22370 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
22380 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
22390 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
223a0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
223b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
223c0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
223d0 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
223e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
223f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22400 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22410 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
22420 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
22430 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
22440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
22450 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
22460 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
22470 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
22480 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
22490 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
224a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
224b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
224c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
224d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
224e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
224f0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
22500 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
22510 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
22520 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
22530 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
22540 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
22550 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
22560 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
22570 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
22580 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
22590 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
225a0 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
225b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
225c0 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
225d0 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
225e0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
225f0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
22600 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73  l && (pPager->us
22610 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44  eJournal || MEMD
22620 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  B) ){.      if( 
22630 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
22640 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
22650 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22660 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
22670 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
22680 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
22690 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
226a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
226b0 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55  PAGERTRACE3("JOU
226c0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
226d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
226e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
226f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22700 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
22710 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
22720 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
22730 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
22740 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
22750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22760 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
22770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
22780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22790 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
227a0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
227b0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
227c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
227d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
227e0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ze);.        }el
227f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
22800 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
22810 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
22820 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
22830 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
22840 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
22850 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
22860 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
22870 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
22880 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
22890 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
228a0 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
228b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
228c0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
228d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
228e0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
228f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
22900 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
22910 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
22920 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
22930 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
22940 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
22950 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
22960 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
22970 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22980 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
22990 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
229a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
229b0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
229c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
229d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
229e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
229f0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
22a00 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
22a10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22a50 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
22a60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
22a70 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
22a80 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
22a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22aa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22ac0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
22ad0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
22ae0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
22af0 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
22b00 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
22b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
22b20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
22b30 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
22b40 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
22b50 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
22b60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22b90 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
22ba0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
22bb0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
22bc0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
22bd0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
22be0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
22bf0 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E5("JOURNAL %d p
22c00 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
22c10 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
22c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22c30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22c40 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
22c50 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65  ->needSync, page
22c60 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
22c70 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
22c80 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
22c90 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
22ca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22cb0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
22cc0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
22cd0 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
22ce0 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
22cf0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
22d00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
22d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22d40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
22d50 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
22d60 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
22d70 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
22d80 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
22d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
22da0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
22db0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
22dc0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
22dd0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
22de0 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
22df0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
22e00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
22e10 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
22e20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
22e30 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
22e40 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
22e50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
22e70 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
22e80 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
22e90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
22ea0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
22eb0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50  oSync;.        P
22ec0 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
22ed0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
22ee0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
22f00 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22f10 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
22f20 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
22f30 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
22f40 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
22f50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
22f60 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
22f70 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
22f80 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
22f90 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
22fa0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
22fb0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
22fc0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
22fd0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
22fe0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
22ff0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
23000 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
23010 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
23020 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
23030 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
23040 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
23050 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
23060 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
23070 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
23080 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
23090 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
230a0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
230b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
230c0 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70  nUse .     && !p
230d0 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
230e0 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e  Pg) .     && (in
230f0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
23100 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
23110 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
23120 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
23130 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
23140 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
23150 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
23160 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
23170 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
23180 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
23190 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
231a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
231b0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
231c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
231d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
231e0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
231f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
23200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23210 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
23220 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
23230 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
23240 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
23250 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23260 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
23270 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23280 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
23290 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
232a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
232b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
232c0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
232d0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
232e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
232f0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
23300 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
23310 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
23320 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23330 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
23340 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
23350 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
23360 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 7);.        rc
23370 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
23380 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
23390 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
233a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
233b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
233c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
233d0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
233e0 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
233f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23400 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
23410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23420 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
23430 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
23440 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
23450 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
23460 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
23470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
23490 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
234a0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
234b0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
234c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
234d0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d  Pager->pInStmt!=
234e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
234f0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
23500 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
23510 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
23520 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
23530 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
23540 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
23550 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
23560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23570 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
23580 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
23590 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
235a0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
235b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
235c0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
235d0 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
235e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
235f0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
23600 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
23610 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
23620 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
23630 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23640 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23650 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
23660 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
23670 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
23680 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
23690 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
236a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
236b0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
236c0 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
236d0 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
236e0 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
236f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
23700 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
23710 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
23720 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
23730 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
23740 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
23750 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
23760 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
23770 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
23780 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
23790 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
237a0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
237b0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
237c0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
237d0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
237e0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
237f0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
23800 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
23810 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23820 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
23830 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
23840 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
23850 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
23860 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
23870 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
23880 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
23890 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
238a0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
238b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
238c0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
238d0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d  Pager);.  if( !M
238e0 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
238f0 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
23900 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
23910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
23920 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
23930 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
23940 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
23950 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
23960 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
23970 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
23980 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
23990 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
239a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
239b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
239c0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
239d0 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
239e0 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
239f0 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
23a00 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
23a10 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
23a20 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
23a30 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
23a40 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
23a50 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
23a60 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
23a70 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
23a80 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
23a90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
23aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
23ab0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
23ac0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
23ad0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
23ae0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
23af0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
23b00 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
23b10 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
23b20 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
23b30 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
23b40 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
23b50 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
23b60 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
23b70 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
23b80 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
23b90 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
23ba0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
23bb0 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
23bc0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
23bd0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
23be0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50  1)) + 1;..    nP
23bf0 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74  ageCount = sqlit
23c00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
23c10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
23c20 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
23c30 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
23c40 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
23c50 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
23c60 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
23c70 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
23c80 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
23c90 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
23ca0 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
23cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23cc0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
23cd0 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
23ce0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
23cf0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
23d00 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
23d10 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
23d20 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
23d30 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
23d40 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
23d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
23d60 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
23d70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
23d80 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
23d90 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
23da0 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
23db0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
23dc0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
23dd0 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
23de0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
23df0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
23e00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
23e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
23e20 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
23e30 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23e60 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
23e70 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
23e80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
23e90 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
23ea0 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
23eb0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
23ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23ed0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
23ee0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
23ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23f00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
23f10 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
23f20 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
23f30 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
23f40 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
23f50 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
23f60 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
23f70 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
23f80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23f90 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e  /* If the PgHdr.
23fa0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
23fb0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
23fc0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
23fd0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
23fe0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
23ff0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
24000 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
24010 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
24020 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
24030 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
24040 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
24050 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
24060 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
24070 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
24080 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
24090 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
240a0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
240b0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
240c0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
240d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
240e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
240f0 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ( needSync ){.  
24100 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
24110 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
24120 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
24130 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
24140 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
24150 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
24160 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24170 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  e ) pPage->needS
24180 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
24190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
241a0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
241b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
241c0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
241d0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
241e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
241f0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
24200 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
24210 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24220 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
24230 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
24240 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24250 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
24260 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
24270 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
24280 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
24290 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
242a0 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
242b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
242c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
242d0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
242e0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
242f0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
24300 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
24310 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
24320 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
24330 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
24340 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
24350 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
24360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
24370 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
24380 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24390 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
243a0 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
243b0 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
243c0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
243d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
243e0 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
243f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
24400 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
24410 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
24420 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67    int rc;..  pag
24430 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
24440 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
24450 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24460 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69  pgno, &pPg);.  i
24470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24480 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24490 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
244a0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
244b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
244c0 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74      memcpy(sqlit
244d0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
244e0 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67  Pg), pData, pPag
244f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
24500 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24510 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
24520 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
24530 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
24540 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
24550 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
24560 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
24570 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
24580 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
24590 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
245a0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
245b0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
245c0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
245d0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
245e0 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
245f0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
24600 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
24610 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
24620 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
24630 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
24640 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
24650 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
24660 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
24670 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
24680 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
24690 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
246a0 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
246b0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
246c0 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
246d0 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
246e0 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
246f0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
24700 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
24710 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
24720 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
24730 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
24740 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
24750 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
24760 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
24770 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
24780 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
24790 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
247a0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
247b0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
247c0 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
247d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
247e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
247f0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
24800 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
24810 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
24820 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
24830 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
24840 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
24850 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
24860 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
24870 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
24880 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
24890 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
248a0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
248b0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
248c0 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
248d0 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
248e0 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
248f0 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
24900 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
24910 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
24920 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
24930 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
24940 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
24950 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
24960 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
24970 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
24980 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72  DontRollback() r
24990 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
249a0 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
249b0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  he.** page conta
249c0 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74  ins critical dat
249d0 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
249e0 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
249f0 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ets.** rolled ba
24a00 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74  ck in spite of t
24a10 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
24a20 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61  ontRollback() ca
24a30 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
24a40 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
24a50 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
24a60 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
24a70 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
24a80 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
24a90 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
24aa0 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
24ab0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
24ac0 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61  Pager);.  pPg->a
24ad0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
24ae0 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
24af0 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
24b00 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
24b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24b20 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
24b30 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
24b40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24b50 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
24b60 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
24b70 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
24b80 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
24b90 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
24ba0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
24bb0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
24bc0 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
24bd0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
24be0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
24bf0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
24c00 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
24c10 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
24c20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
24c30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
24c40 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
24c50 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
24c60 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
24c70 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
24c80 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
24c90 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
24ca0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
24cb0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
24cc0 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
24cd0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
24ce0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
24cf0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
24d00 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
24d10 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
24d20 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
24d30 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
24d40 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
24d50 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
24d60 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
24d70 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
24d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24d90 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
24da0 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
24db0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
24dc0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
24dd0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
24de0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
24df0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
24e00 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
24e10 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
24e20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
24e30 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
24e40 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
24e50 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
24e60 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
24e70 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
24e80 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d  Leave(pPager);.}
24e90 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
24ea0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
24eb0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
24ec0 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
24ed0 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
24ee0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
24ef0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
24f00 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
24f10 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
24f20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
24f30 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
24f40 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
24f50 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
24f60 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
24f70 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
24f80 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  f we have not ye
24f90 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  t actually read 
24fa0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
24fb0 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20  his page (if.** 
24fc0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
24fd0 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20  ad flag is set) 
24fe0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24ff0 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d  e acts as a prom
25000 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77  ise.** that we w
25010 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74  ill never need t
25020 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  o read the page 
25030 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66  content in the f
25040 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65  uture..** so the
25050 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63   needRead flag c
25060 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  an be cleared at
25070 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 0a   this point..**.
25080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25090 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
250a0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 70 6c 61  rom a single pla
250b0 63 65 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ce in the sqlite
250c0 20 62 74 72 65 65 0a 2a 2a 20 63 6f 64 65 20 28   btree.** code (
250d0 77 68 65 6e 20 61 20 6c 65 61 66 20 69 73 20 72  when a leaf is r
250e0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
250f0 66 72 65 65 2d 6c 69 73 74 29 2e 20 54 68 69 73  free-list). This
25100 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 66   allows the.** f
25110 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 75 6d 70 74  ollowing assumpt
25120 69 6f 6e 73 20 74 6f 20 62 65 20 6d 61 64 65 20  ions to be made 
25130 61 62 6f 75 74 20 70 50 67 3a 0a 2a 2a 0a 2a 2a  about pPg:.**.**
25140 20 20 20 31 2e 20 50 61 67 65 72 44 6f 6e 74 57     1. PagerDontW
25150 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20  rite() has been 
25160 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
25170 67 65 2c 20 4f 52 20 0a 2a 2a 20 20 20 20 20 20  ge, OR .**      
25180 50 61 67 65 72 57 72 69 74 65 28 29 20 68 61 73  PagerWrite() has
25190 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61   not yet been ca
251a0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
251b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
251c0 20 70 61 67 65 20 65 78 69 73 74 65 64 20 77 68   page existed wh
251d0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
251e0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a  on was started..
251f0 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 20 44  **.** Details: D
25200 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 28 74  ontRollback() (t
25210 68 69 73 20 72 6f 75 74 69 6e 65 29 20 69 73 20  his routine) is 
25220 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 77 68 65 6e  only called when
25230 20 61 20 6c 65 61 66 20 69 73 0a 2a 2a 20 72 65   a leaf is.** re
25240 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
25250 72 65 65 20 6c 69 73 74 2e 20 44 6f 6e 74 57 72  ree list. DontWr
25260 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
25270 77 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20  whenever a page 
25280 0a 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 66 72  .** becomes a fr
25290 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 2a 2f  ee-list leaf..*/
252a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
252b0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
252c0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
252d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
252e0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70  Pg->pPager;..  p
252f0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
25300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25310 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
25320 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20  R_RESERVED );.. 
25330 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
25340 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  al file is not o
25350 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74  pen, or DontWrit
25360 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
25370 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73  led on.  ** this
25380 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65   page (DontWrite
25390 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61  () sets the alwa
253a0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29  ysRollback flag)
253b0 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a  , then this.  **
253c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
253d0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
253e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
253f0 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  Open==0 || pPg->
25400 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
25410 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
25420 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
25430 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
25440 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  r);.    return;.
25450 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 4d    }.  assert( !M
25460 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f  EMDB );    /* Fo
25470 72 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67 65  r a memdb, pPage
25480 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69  r->journalOpen i
25490 73 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 20  s always 0 */.. 
254a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 50   /* Check that P
254b0 61 67 65 72 57 72 69 74 65 28 29 20 68 61 73 20  agerWrite() has 
254c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c  not yet been cal
254d0 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
254e0 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20  , and.  ** that 
254f0 74 68 65 20 70 61 67 65 20 65 78 69 73 74 65 64  the page existed
25500 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
25510 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2e 0a 20  ction started.. 
25520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
25530 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
25540 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
25550 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
25560 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65  bSize );..  asse
25570 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
25580 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
25590 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
255a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
255b0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
255c0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
255d0 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65   = 1;.  pPg->nee
255e0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66 28  dRead = 0;.  if(
255f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
25600 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
25610 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
25620 7a 65 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze <= pPager->or
25630 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
25640 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
25650 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
25660 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
25670 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
25680 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
25690 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
256a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
256b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
256c0 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
256d0 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
256e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
256f0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
25700 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
25710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25720 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
25730 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
25740 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
25750 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
25760 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
25770 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
25780 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25790 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
257a0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
257b0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
257c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
257d0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
257e0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
257f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25800 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
25810 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25820 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
25830 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
25840 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
25850 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
25860 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
25870 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
25880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25890 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
258a0 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44  c;..    if( !isD
258b0 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72  irect ){.      r
258c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
258d0 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
258e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
258f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25900 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
25910 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
25920 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25940 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
25950 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
25960 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
25970 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
25980 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
25990 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
259a0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
259b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
259c0 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
259d0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
259e0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
259f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
25a00 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
25a10 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
25a20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
25a30 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
25a40 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
25a50 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
25a60 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
25a70 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72  pPgHdr);.      r
25a80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
25a90 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
25aa0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
25ab0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d  eSize, 0);.    }
25ac0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
25ad0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
25ae0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
25af0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
25b00 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
25b10 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
25b20 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
25b30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25b40 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
25b50 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a   file to disk..*
25b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25b70 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
25b80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
25b90 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
25ba0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
25bb0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25bc0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
25bd0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70  sync_flags);.  p
25be0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25c00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
25c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25c20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
25c30 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
25c40 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
25c50 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
25c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
25c70 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
25c80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
25c90 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
25ca0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
25cb0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
25cc0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
25cd0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
25ce0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
25cf0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
25d00 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
25d10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
25d20 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
25d30 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
25d40 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
25d50 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
25d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25d70 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
25d80 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
25d90 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
25da0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
25db0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
25dc0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
25dd0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
25de0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
25df0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
25e00 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
25e10 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25e20 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
25e30 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
25e40 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
25e50 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
25e60 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
25e70 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
25e80 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
25e90 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
25ea0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
25eb0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
25ec0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
25ed0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
25ee0 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
25ef0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
25f00 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
25f10 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s)..**.** If the
25f20 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
25f30 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
25f40 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
25f50 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
25f60 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
25f70 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
25f80 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
25f90 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
25fa0 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
25fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25fc0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
25fd0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
25fe0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
25ff0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
26000 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
26010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26020 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
26030 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
26040 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
26050 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67   *zMaster, .  Pg
26060 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74  no nTrunc,.  int
26070 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74   noSync.){.  int
26080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26090 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
260a0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
260b0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
260c0 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
260d0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
260e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
260f0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70  er, nTrunc);.  p
26100 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
26110 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
26120 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
26130 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
26140 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
26150 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
26160 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
26170 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
26180 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
26190 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
261a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
261b0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
261c0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
261d0 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
261e0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a     PgHdr *pPg;..
261f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26200 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
26210 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
26220 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
26230 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
26240 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
26250 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
26260 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
26270 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
26280 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
26290 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
262a0 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
262b0 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
262c0 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
262d0 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
262e0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
262f0 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
26300 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
26310 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
26320 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
26330 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
26340 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
26350 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
26360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26370 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
26380 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
26390 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
263a0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
263b0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
263c0 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
263d0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
263e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
263f0 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f  /.    int useAto
26400 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
26410 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
26420 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
26430 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
26440 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
26450 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
26460 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20   nTrunc==0 && . 
26470 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65         (0==pPage
26480 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d  r->pDirty || 0==
26490 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
264a0 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20  pDirty).    );. 
264b0 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63     if( useAtomic
264c0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
264d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
264e0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
264f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
26500 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
26510 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26520 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
26530 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
26540 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
26550 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
26560 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
26570 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
26580 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
26590 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
265a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
265b0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
265c0 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
265d0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
265e0 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
265f0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
26600 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
26610 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
26620 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
26630 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
26640 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
26650 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
26660 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
26670 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
26680 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
26690 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
266a0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
266b0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
266c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
266d0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
266e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
266f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26700 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
26710 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
26720 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
26730 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26740 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26750 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
26760 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
26770 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
26780 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26  seAtomicWrite &&
26790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
267a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
267b0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
267c0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
267d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
267e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
267f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
26800 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
26810 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
26820 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
26830 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
26840 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
26850 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
26860 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
26870 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
26880 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
26890 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
268a0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
268b0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
268c0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
268d0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
268e0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
268f0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
26900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26910 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
26920 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ter ){.      ass
26930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26940 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
26950 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
26960 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
26970 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
26980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26990 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
269a0 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
269b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
269c0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
269d0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
269e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
269f0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
26a00 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
26a10 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
26a20 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
26a30 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
26a40 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
26a50 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
26a60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26a70 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
26a80 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
26a90 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
26aa0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
26ab0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
26ac0 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
26ad0 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
26ae0 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
26af0 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
26b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26b10 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
26b20 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
26b30 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
26b40 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
26b50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26b60 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
26b70 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
26b80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26ba0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
26bb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26bc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26bd0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
26be0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
26bf0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
26c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26c10 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26c20 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
26c40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
26c50 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
26c60 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
26c70 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
26c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26c90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26ca0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26cb0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
26cc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
26cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26ce0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26cf0 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
26d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26d10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26d20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
26d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26d40 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
26d50 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
26d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26d70 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26d80 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
26d90 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
26da0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
26db0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
26dc0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
26dd0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
26de0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
26df0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
26e00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
26e10 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
26e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26e30 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
26e40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
26e50 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
26e60 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
26e70 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
26e80 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
26e90 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
26ea0 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
26eb0 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
26ec0 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
26ed0 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
26ee0 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
26ef0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
26f00 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
26f10 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
26f20 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
26f30 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
26f40 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
26f50 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
26f60 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
26f70 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
26f80 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
26f90 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
26fa0 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
26fb0 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
26fc0 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
26fd0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
26fe0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
26ff0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  xit;.    }.    p
27000 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27010 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
27020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27030 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
27040 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
27050 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
27060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27070 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
27080 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
27090 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
270a0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
270b0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
270c0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
270d0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
270e0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
270f0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
27100 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
27110 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27120 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
27130 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
27140 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
27150 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
27160 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
27170 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27180 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
27190 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
271a0 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
271b0 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
271c0 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
271d0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
271e0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
271f0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
27200 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
27210 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
27220 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20  ent, it is.     
27230 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
27240 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
27250 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
27260 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
27270 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
27280 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27290 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
272a0 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
272b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
272c0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
272d0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
272e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
272f0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
27300 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
27310 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
27320 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
27330 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27340 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
27350 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
27360 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
27370 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
27380 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
27390 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
273a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
273b0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
273c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
273d0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
273e0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
273f0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
27400 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
27410 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
27420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27430 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
27440 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
27450 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
27460 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
27470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27480 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27490 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
274a0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
274b0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
274c0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
274d0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
274e0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
274f0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
27500 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
27510 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
27520 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
27530 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
27540 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
27550 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
27560 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
27570 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
27580 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
27590 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
275a0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
275b0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
275c0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
275d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
275e0 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
275f0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
27600 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
27610 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
27620 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
27630 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
27640 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
27650 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
27660 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
27670 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
27680 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
27690 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
276a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
276b0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
276c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
276d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
276e0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
276f0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
27700 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67  _SHARED;.    pag
27710 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27730 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
27740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
27750 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
27760 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
27770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27780 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
27790 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
277a0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
277b0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
277c0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
277d0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
277e0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
277f0 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72  er, rc);.  pager
27800 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
27810 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27820 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
27830 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
27840 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
27850 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
27860 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
27870 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
27880 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
27890 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
278a0 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
278b0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
278c0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
278d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
278e0 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
278f0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
27900 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
27910 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
27920 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
27930 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
27940 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
27950 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
27960 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
27970 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
27980 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
27990 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
279a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
279b0 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
279c0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
279d0 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
279e0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
279f0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
27a00 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
27a10 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
27a20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
27a30 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
27a40 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
27a50 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27a60 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
27a70 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
27a80 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
27a90 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27aa0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
27ab0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27ac0 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
27ad0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
27ae0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
27af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27b00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
27b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
27b20 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
27b30 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
27b40 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
27b50 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
27b60 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
27b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
27b80 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
27b90 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
27ba0 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
27bb0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
27bc0 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
27bd0 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
27be0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
27bf0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
27c00 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
27c10 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
27c20 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
27c30 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
27c40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
27c50 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
27c60 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
27c70 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
27c80 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
27c90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
27ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27cb0 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
27cc0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
27cd0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
27ce0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27d00 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
27d10 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
27d20 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
27d30 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
27d40 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
27d50 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
27d60 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
27d70 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
27d80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
27d90 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
27da0 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
27db0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
27dc0 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
27dd0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
27de0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
27df0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
27e00 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
27e10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27e20 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
27e30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
27e40 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
27e50 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
27e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
27e70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
27e80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27e90 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
27ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27eb0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72  OK;.  }..  pager
27ec0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
27ed0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
27ee0 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
27ef0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
27f00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
27f10 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
27f20 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
27f30 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
27f40 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
27f50 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
27f60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
27f70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27f80 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
27f90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
27fa0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
27fb0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
27fc0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27fd0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27fe0 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  }.    pagerLeave
27ff0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
28000 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
28010 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
28020 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
28030 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
28040 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
28050 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
28060 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
28070 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
28080 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
28090 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
280a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
280b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
280c0 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
280d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
280e0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
280f0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  r, 0);.  }.  /* 
28100 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
28110 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  er); */.  pPager
28120 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
28130 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
28140 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
28150 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
28160 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
28170 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
28180 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
28190 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
281a0 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
281b0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
281c0 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
281d0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
281e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
281f0 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61   rc);.  pagerLea
28200 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
28210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28220 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
28230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28240 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
28250 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
28260 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
28270 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
28280 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
28290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
282a0 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
282b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
282c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
282d0 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
282e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
282f0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
28300 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
28310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28320 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
28330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28340 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
28350 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ref;.}..#ifdef S
28360 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
28370 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
28380 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
28390 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
283a0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
283b0 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
283c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
283d0 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
283e0 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
283f0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
28400 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
28410 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
28420 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
28430 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
28440 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
28450 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
28460 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
28470 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
28480 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
28490 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
284a0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
284b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
284c0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
284d0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
284e0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
284f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
28500 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
28510 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
28520 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
28530 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
28540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28550 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
28560 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
28570 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
28580 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
28590 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
285a0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
285b0 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
285c0 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
285d0 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
285e0 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
285f0 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
28600 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
28610 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
28620 74 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  t pagerStmtBegin
28630 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28640 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
28650 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
28660 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
28670 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
28680 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
28690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
286a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
286b0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
286c0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
286d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
286e0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
286f0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
28700 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
28710 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28720 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
28730 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
28740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28750 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
28760 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
28770 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
28780 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
28790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
287a0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
287b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
287c0 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c  Open );.  pagerL
287d0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
287e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
287f0 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  pInStmt==0 );.  
28800 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
28810 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
28820 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
28830 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e  Size);.  pagerEn
28840 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
28850 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
28860 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
28870 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
28880 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
28890 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
288a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
288b0 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
288c0 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
288d0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
288e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
288f0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
28900 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
28910 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
28920 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
28930 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
28940 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
28950 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
28960 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
28970 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
28980 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
28990 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
289a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
289b0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
289c0 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
289d0 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
289e0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
289f0 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
28a00 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
28a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28a20 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
28a30 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
28a40 2d 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e  ->stfd, pPager->
28a50 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20  zStmtJrnl,.     
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
28a80 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
28a90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28aa0 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f        goto stmt_
28ab0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
28ac0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
28ad0 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
28ae0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
28af0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
28b00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
28b10 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
28b20 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
28b30 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
28b40 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  if( pPager->pInS
28b50 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
28b60 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
28b70 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
28b80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
28b90 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
28ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
28bb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
28bc0 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
28bd0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
28be0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
28bf0 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
28c00 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
28c10 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
28c20 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
28c30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28c40 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
28c50 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
28c60 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
28c70 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
28c80 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65  er){.  pagerEnte
28c90 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
28ca0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28cb0 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
28cc0 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
28cd0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
28ce0 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
28cf0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28d00 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
28d10 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  DB ){.      /* s
28d20 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
28d30 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
28d40 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
28d50 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
28d60 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
28d70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
28d80 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >pInStmt = 0;.  
28d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
28da0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
28db0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
28dc0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Next){.        P
28dd0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
28de0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
28df0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
28e00 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48        pNext = pH
28e10 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  ist->pNextStmt;.
28e20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28e30 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b  pHist->inStmt );
28e40 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
28e50 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
28e60 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
28e70 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
28e80 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
28e90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28ea0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
28eb0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
28ec0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
28ed0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
28ee0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
28ef0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
28f00 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
28f10 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
28f20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
28f30 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
28f40 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  = 0;.  pagerLeav
28f50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
28f60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f70 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
28f80 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
28f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28fa0 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61  rStmtRollback(Pa
28fb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28fc0 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
28fd0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
28fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
28ff0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47  InUse ){.    PAG
29000 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52  ERTRACE2("STMT-R
29010 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
29020 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
29030 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
29040 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
29050 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74  Pg;.      PgHist
29060 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
29070 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
29080 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
29090 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  g=pHist->pNextSt
290a0 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69  mt){.        pHi
290b0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
290c0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
290d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
290e0 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
290f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
29100 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
29110 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
29120 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
29140 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
29150 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
29160 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
29170 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
29180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
29190 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
291a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
291b0 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e        pager_trun
291c0 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
291d0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
291e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
291f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
29200 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
29210 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
29220 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
29230 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
29240 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
29250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29260 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
29270 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
29280 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
29290 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
292a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
292b0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
292c0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
292d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
292e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
292f0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
29300 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
29310 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
29320 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
29330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
29340 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
29350 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
29360 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
29370 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
29380 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
29390 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
293a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
293b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
293c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
293d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
293e0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
293f0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
29400 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
29410 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
29420 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
29430 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
29440 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
29450 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
29460 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
29470 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
29480 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
29490 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
294a0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
294b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
294c0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
294d0 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
294e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
294f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
29500 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
29510 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29520 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
29530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29540 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
29550 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
29560 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
29570 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29580 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
29590 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
295a0 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
295b0 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
295c0 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
295d0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
295e0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
295f0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
29600 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
29610 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
29620 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
29630 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
29640 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
29650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29660 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
29670 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
29680 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
29690 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
296a0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
296b0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
296c0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
296d0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
296e0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
296f0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
29700 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
29710 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
29720 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
29730 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
29740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29750 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
29760 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
29770 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
29780 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
29790 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
297a0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
297b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
297c0 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
297d0 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
297e0 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
297f0 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
29800 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
29810 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
29820 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
29830 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63  age previous loc
29840 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
29850 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
29860 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
29870 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
29880 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
29890 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
298a0 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
298b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
298c0 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
298d0 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
298e0 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
298f0 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
29900 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
29910 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
29920 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
29930 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
29940 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
29950 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
29960 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
29970 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
29980 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
29990 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
299a0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
299b0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
299c0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
299d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
299e0 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
299f0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
29a00 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
29a10 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
29a20 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
29a30 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
29a40 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
29a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
29a60 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
29a70 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
29a80 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
29a90 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
29aa0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
29ab0 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f  gHdr *pPgOld;  /
29ac0 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
29ad0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
29ae0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
29af0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
29b00 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0;..  pagerEnter
29b10 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
29b20 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
29b30 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
29b40 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
29b50 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
29b60 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
29b70 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
29b80 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29b90 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
29ba0 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  c, pgno);.  IOTR
29bb0 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
29bc0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29bd0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
29be0 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
29bf0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
29c00 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
29c10 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
29c20 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
29c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29c40 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
29c50 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
29c60 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
29c70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
29c80 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
29c90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
29ca0 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
29cb0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
29cc0 72 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68 61  rom its hash-cha
29cd0 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
29ce0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
29cf0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
29d00 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
29d10 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
29d20 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
29d30 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
29d40 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
29d50 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
29d60 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
29d70 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
29d80 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
29d90 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
29da0 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
29db0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
29dc0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
29dd0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
29de0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65  .  */.  pPg->nee
29df0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67  dSync = 0;.  pPg
29e00 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
29e10 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
29e20 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
29e30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29e40 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
29e50 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
29e60 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
29e70 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  Old);.    makeCl
29e80 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  ean(pPgOld);.   
29e90 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
29ea0 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
29eb0 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
29ec0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
29ed0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e  0;.  }.  pPg->in
29ee0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
29ef0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
29f00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
29f10 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61  pgno);..  /* Cha
29f20 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
29f30 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
29f40 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
29f50 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
29f60 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
29f70 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67  pgno!=0 );.  pPg
29f80 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
29f90 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
29fa0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
29fb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
29fc0 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
29fd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
29fe0 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
29ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
2a000 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
2a010 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
2a020 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
2a030 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
2a040 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
2a050 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
2a060 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
2a070 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69  h = 0;..  makeDi
2a080 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
2a090 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
2a0a0 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
2a0b0 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
2a0c0 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
2a0d0 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
2a0e0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2a0f0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
2a100 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
2a110 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
2a120 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
2a130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
2a140 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
2a150 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
2a160 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
2a170 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
2a180 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
2a190 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70   .    ** Pager.p
2a1a0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
2a1b0 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
2a1c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
2a1d0 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
2a1e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
2a1f0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
2a200 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
2a210 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
2a220 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
2a230 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
2a240 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
2a250 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
2a260 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69  e page-cache fai
2a270 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20  ls, (due.    ** 
2a280 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  to a malloc() or
2a290 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c   IO failure), cl
2a2a0 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74  ear the bit in t
2a2b0 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a  he pInJournal[].
2a2c0 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74      ** array. Ot
2a2d0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2a2e0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61  page is loaded a
2a2f0 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e  nd written again
2a300 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   in.    ** this 
2a310 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
2a320 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74  may be written t
2a330 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a340 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ile before.    *
2a350 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69  * it is synced i
2a360 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2a370 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20  file. This way, 
2a380 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e  it may end up in
2a390 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
2a3a0 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20  nal file twice, 
2a3b0 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  but that is not 
2a3c0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a  a problem..    *
2a3d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
2a3e0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
2a3f0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
2a400 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
2a410 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
2a420 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
2a430 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
2a440 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
2a450 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
2a460 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
2a470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a480 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
2a490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a4a0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2a4b0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
2a4c0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
2a4d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a4e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
2a4f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
2a500 26 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63  && (int)needSync
2a510 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  Pgno<=pPager->or
2a520 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
2a530 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
2a540 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  cClear(pPager->p
2a550 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53  InJournal, needS
2a560 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  yncPgno);.      
2a570 7d 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61  }.      pagerLea
2a580 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
2a590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a5a0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
2a5b0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2a5c0 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e   pPgHdr->needSyn
2a5d0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
2a5e0 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  r->inJournal = 1
2a5f0 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28  ;.    makeDirty(
2a600 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
2a610 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2a620 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  PgHdr);.  }..  p
2a630 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
2a640 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a650 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
2a660 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2a670 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
2a680 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
2a690 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
2a6a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
2a6b0 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
2a6c0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
2a6d0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
2a6e0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
2a6f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2a700 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
2a710 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
2a720 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
2a730 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
2a740 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
2a750 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
2a760 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2a770 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
2a780 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2a790 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a7a0 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
2a7b0 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  r?PGHDR_TO_EXTRA
2a7c0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29  (pPg, pPager):0)
2a7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
2a7e0 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
2a7f0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
2a800 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
2a810 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
2a820 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
2a830 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
2a840 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a850 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
2a860 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a870 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
2a880 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
2a890 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
2a8a0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
2a8b0 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
2a8c0 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
2a8d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
2a8e0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
2a8f0 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
2a900 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2a910 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
2a920 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2a930 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
2a940 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
2a950 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
2a960 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
2a970 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2a980 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
2a990 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2a9a0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
2a9b0 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
2a9c0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2a9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2a9e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
2a9f0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2aa10 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2aa20 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2aa30 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2aa40 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2aa50 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
2aa60 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2aa70 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
2aa80 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
2aa90 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2aaa0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
2aab0 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
2aac0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
2aad0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2aae0 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
2aaf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
2ab00 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
2ab10 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66  siveMode;.}..#if
2ab20 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2ab30 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
2ab40 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
2ab50 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
2ab60 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
2ab70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2ab80 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
2ab90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2aba0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
2abb0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
2abc0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
2abd0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
2abe0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
2abf0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2ac00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ac10 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
2ac20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
2ac30 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
2ac40 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
2ac50 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
2ac60 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
2ac70 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
2ac80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
2ac90 4f 20 2a 2f 0a                                   O */.