/ Hex Artifact Content
Login

Artifact 2f5f55a9405a17240adede9e3b671778fb9a4978:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 35  : pager.c,v 1.45
0350: 39 20 32 30 30 38 2f 30 36 2f 31 38 20 31 37 3a  9 2008/06/18 17:
0360: 30 39 3a 31 30 20 64 61 6e 69 65 6c 6b 31 39 37  09:10 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0690: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
06a0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
06b0: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
06c0: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06d0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06e0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06f0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
0700: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
0710: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0720: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0730: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0740: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0750: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0760: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0770: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0790: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
07a0: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
07b0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07c0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07e0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
0800: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0810: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0820: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0840: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0850: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0860: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0890: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
08a0: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
08b0: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08c0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08f0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
0900: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0930: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0940: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0950: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0960: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0970: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0990: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
09a0: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
09b0: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09c0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09f0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
0a00: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
0a10: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a40: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a50: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a60: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a90: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0aa0: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ad0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ae0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0af0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b20: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b30: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b40: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b70: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b80: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0ba0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0bc0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bd0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0be0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0c10: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c20: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c30: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c40: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c50: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c60: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c80: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c90: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0ca0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cd0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0ce0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cf0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d10: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d20: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d30: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d90: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0da0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0db0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0dc0: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0dd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0de0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0df0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0e00: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0e10: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0e20: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e30: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e40: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e50: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e60: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e70: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e80: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e90: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0ea0: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0eb0: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0ec0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ed0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0ee0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ef0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f00: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f10: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f20: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f30: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f40: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f50: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f60: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f70: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f80: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f90: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0fa0: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0fb0: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0fc0: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fd0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fe0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0ff0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
1000: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1010: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
1020: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1030: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1050: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1060: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1070: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1080: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1090: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
10a0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
10b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
10c0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10d0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10e0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10f0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
1100: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
1110: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1130: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1140: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1150: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1160: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1170: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1180: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1190: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
11a0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
11b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
11c0: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11d0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
1200: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
1210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
1220: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1230: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1240: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1250: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1260: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1270: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1280: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1290: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
12a0: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
12b0: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
12c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12d0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12e0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12f0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
1300: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1310: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
1320: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1330: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1340: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1350: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1360: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1370: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1380: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1390: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
13a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13b0: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
13c0: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13d0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13e0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13f0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
1400: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
1410: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
1420: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1430: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1440: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1450: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1460: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1470: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1480: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1490: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
14a0: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
14b0: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
14c0: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14d0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14e0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1500: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
1510: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
1520: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1540: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1550: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1560: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1570: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1580: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1590: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
15a0: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
15b0: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
15c0: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15d0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15e0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15f0: 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66 20 73  )&~7)..typedef s
1600: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
1610: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 70  r;../*.** Each p
1620: 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c 6c 20  ager stores all 
1630: 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 66 65  currently unrefe
1640: 72 65 6e 63 65 64 20 70 61 67 65 73 20 69 6e 20  renced pages in 
1650: 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a 2a 2a  a list sorted.**
1660: 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65 6e 74   in least-recent
1670: 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20 6f 72  ly-used (LRU) or
1680: 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20 66 69  der (i.e. the fi
1690: 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  rst item on the 
16a0: 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e 6f 74  list has .** not
16b0: 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
16c0: 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d 65 2c   in a long time,
16d0: 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 68   the last item h
16e0: 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74 6c 79  as been recently
16f0: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20 69 6e  .** used). An in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1710: 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 63 6c  tructure is incl
1720: 75 64 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  uded as part of 
1730: 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20 73 74  each.** pager st
1740: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1750: 20 70 75 72 70 6f 73 65 20 28 76 61 72 69 61 62   purpose (variab
1760: 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e 0a 2a  le Pager.lru)..*
1770: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1780: 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  y, if memory-man
1790: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
17a0: 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ed, all unrefere
17b0: 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a 20 61  nced pages .** a
17c0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 67  re stored in a g
17d0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 20 28  lobal LRU list (
17e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
17f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1800: 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  st)..**.** In bo
1810: 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 50 61  th cases, the Pa
1820: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
1830: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
1840: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1850: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
1860: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1870: 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f 65 73  g list that does
1880: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 0a   not require an.
1890: 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61  ** fsync() opera
18a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 73 20  tion before its 
18b0: 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 72 65  memory can be re
18c0: 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e 6f 20 73  claimed. If no s
18d0: 75 63 68 0a 2a 2a 20 70 61 67 65 20 65 78 69 73  uch.** page exis
18e0: 74 73 2c 20 50 61 67 65 72 4c 72 75 4c 69 73 74  ts, PagerLruList
18f0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 69 73  .pFirstSynced is
1900: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
1910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1920: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50 61 67  PagerLruList Pag
1930: 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72 75 63  erLruList;.struc
1940: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 7b  t PagerLruList {
1950: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1960: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ;         /* Fir
1970: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
1980: 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1990: 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
19a0: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
19b0: 4c 52 55 20 6c 69 73 74 20 28 74 68 65 20 6d 6f  LRU list (the mo
19c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
19d0: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  ) */.  PgHdr *pF
19e0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a  irstSynced;   /*
19f0: 20 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c   First page in l
1a00: 69 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ist with PgHdr.n
1a10: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b  eedSync==0 */.};
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1a40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 78  contains the nex
1a50: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 70  t and previous p
1a60: 6f 69 6e 74 65 72 73 20 75 73 65 64 0a 2a 2a 20  ointers used.** 
1a70: 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48 64 72 20  to link a PgHdr 
1a80: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 61  structure into a
1a90: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 69   PagerLruList li
1aa0: 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a 2f 0a 74  nked list. .*/.t
1ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1ac0: 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61 67 65 72  gerLruLink Pager
1ad0: 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20  LruLink;.struct 
1ae0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 7b 0a 20  PagerLruLink {. 
1af0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
1b00: 20 50 67 48 64 72 20 2a 70 50 72 65 76 3b 0a 7d   PgHdr *pPrev;.}
1b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  ;../*.** Each in
1b20: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1b30: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1b40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1b50: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1b60: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1b70: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1b80: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1b90: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1ba0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1bb0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1bc0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1bd0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1be0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1bf0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1c00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c10: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1c20: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1c30: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1c40: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1c50: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1c60: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c70: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1c80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1c90: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1ca0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cb0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1cc0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1cd0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1ce0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1cf0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1d00: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1d10: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1d20: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1d30: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1d40: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1d50: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1d60: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1d70: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1d80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1d90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1da0: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1db0: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1dc0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1dd0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1de0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1df0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1e00: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1e10: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1e20: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1e30: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e40: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1e50: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1e60: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1e70: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1e80: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1e90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1ea0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ile..**.** Detai
1eb0: 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20  ls of important 
1ec0: 73 74 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e  structure elemen
1ed0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ts:.**.** needSy
1ee0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  nc.**.**     If 
1ef0: 74 68 69 73 20 69 73 20 74 72 75 65 2c 20 74 68  this is true, th
1f00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74  is means that it
1f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
1f20: 77 72 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a  write the page.*
1f30: 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f  *     content to
1f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1f50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
1f60: 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65  al content neede
1f70: 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c  d.**     for rol
1f80: 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79  lback has not by
1f90: 20 73 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d   synced to the m
1fa0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
1fb0: 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65  rnal..**     The
1fc0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1fd0: 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  t may have been 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72  written to the r
1ff0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
2000: 2a 2a 20 20 20 20 20 62 75 74 20 69 74 20 68 61  **     but it ha
2010: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73  s not yet been s
2020: 79 6e 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61  ynced.  So we ca
2030: 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68  nnot write to th
2040: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2050: 20 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 70    file because p
2060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67  ower failure mig
2070: 68 74 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ht cause the pag
2080: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
2090: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20   file.**     to 
20a0: 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 65 20  never reach the 
20b0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20  disk.  It is as 
20c0: 69 66 20 74 68 65 20 77 72 69 74 65 20 74 6f 20  if the write to 
20d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e0: 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74  .**     does not
20f0: 20 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65   occur until the
2100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2110: 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20   synced..**     
2120: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2130: 67 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  g is false if th
2140: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65  e page content e
2150: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77  xactly matches w
2160: 68 61 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65  hat.**     curre
2170: 6e 74 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74  ntly exists in t
2180: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2190: 2e 20 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20  .  The needSync 
21a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  flag is also.** 
21b0: 20 20 20 20 66 61 6c 73 65 20 69 66 20 74 68 65      false if the
21c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21d0: 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  t has been writt
21e0: 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  en to the main r
21f0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a  ollback.**     j
2200: 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65  ournal and synce
2210: 64 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  d.  If the page 
2220: 72 65 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77  represents a new
2230: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a   page that has.*
2240: 2a 20 20 20 20 20 62 65 65 6e 20 61 64 64 65 64  *     been added
2250: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
2270: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
2280: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
2290: 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e  ion, the needSyn
22a0: 63 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 75  c flag is true u
22b0: 6e 74 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61  ntil the origina
22c0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  l database.**   
22d0: 20 20 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f    size in the jo
22e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
22f0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2300: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f  disk..**.** inJo
2310: 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urnal.**.**     
2320: 54 68 69 73 20 69 73 20 74 72 75 65 20 69 66 20  This is true if 
2330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2340: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2350: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
2360: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
2370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
2380: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
2390: 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 61 64  for new pages ad
23a0: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
23b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23c0: 61 62 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e  abase file durin
23d0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20  ansaction..**   
23f0: 20 20 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20    And this flag 
2400: 73 61 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f  says nothing abo
2410: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
2420: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  t the journal.**
2430: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 73 79       has been sy
2440: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46  nced to disk.  F
2450: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 61 72  or pages that ar
2460: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
2470: 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73  l.**     databas
2480: 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  e file, the foll
2490: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
24a0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
24b0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24c0: 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20      inJournal = 
24d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24e0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24f0: 72 6e 61 6c 2c 20 70 67 6e 6f 29 0a 2a 2a 0a 2a  rnal, pgno).**.*
2500: 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65 72  *     The pPager
2510: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 6f 62 6a  ->pInJournal obj
2520: 65 63 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ect is only vali
2530: 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  d for the origin
2540: 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  al.**     pages 
2550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
2560: 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74   not new pages t
2570: 68 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f  hat are added to
2580: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
2590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
25a0: 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68   so obviously th
25b0: 65 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69  e above expressi
25c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  on cannot be.** 
25d0: 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65      valid for ne
25e0: 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65  w pages.  For ne
25f0: 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61  w pages inJourna
2600: 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a  l is always 0..*
2610: 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a  *.** dirty.**.**
2620: 20 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20       When true, 
2630: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2650: 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2660: 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64  .**     modified
2670: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2680: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61  le..**     If fa
26b0: 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  lse, it means th
26c0: 61 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  at either the co
26d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
26e0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68  e is.**     unch
26f0: 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68  anged or else th
2700: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69  e content is uni
2710: 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20  mportant and we 
2720: 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61  do not.**     ca
2730: 72 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  re whether or no
2740: 74 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65  t it is preserve
2750: 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52  d..**.** alwaysR
2760: 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  ollback.**.**   
2770: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2780: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2790: 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
27a0: 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a   API should be.*
27b0: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f  *     ignored fo
27c0: 72 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68  r this page.  Th
27d0: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
27e0: 20 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f   API attempts to
27f0: 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74   say.**     that
2800: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2810: 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b  the page on disk
2820: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2830: 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20  (it is an.**    
2840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20   unused page on 
2850: 74 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f  the freelist) so
2860: 20 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65   that it is unne
2870: 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20  cessary to .**  
2880: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e     rollback chan
2890: 67 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65  ges to this page
28a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
28b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
28c0: 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e  .**     can chan
28d0: 67 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ge without chang
28e0: 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  ing the meaning 
28f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2900: 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c    This.**     fl
2910: 61 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ag overrides any
2920: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2930: 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66  attempt.  This f
2940: 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  lag is set.**   
2950: 20 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68    when a page th
2960: 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  at originally co
2970: 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61  ntained valid da
2980: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  ta is added to.*
2990: 2a 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69  *     the freeli
29a0: 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68  st.  Later in th
29b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
29c0: 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69  on, this page mi
29d0: 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75  ght.**     be pu
29e0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  lled from the fr
29f0: 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  eelist and reuse
2a00: 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  d for something 
2a10: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20  different.**    
2a20: 20 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69   and at that poi
2a30: 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  nt the DontRollb
2a40: 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62  ack() API will b
2a50: 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65  e called because
2a60: 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61  .**     pages ta
2a70: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ken from the fre
2a80: 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65  elist do not nee
2a90: 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65  d to be protecte
2aa0: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
2ab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ac0: 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67  .  But this flag
2ad0: 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70   says that the p
2ae0: 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e  age was.**     n
2af0: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  ot originally pa
2b00: 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  rt of the freeli
2b10: 73 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74  st so that it st
2b20: 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20  ill needs to.** 
2b30: 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61      be rolled ba
2b40: 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61  ck in spite of a
2b50: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f  ny subsequent Do
2b60: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
2b70: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65  ls..**.** needRe
2b80: 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ad .**.**     Th
2b90: 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77  is flag means (w
2ba0: 68 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74  hen true) that t
2bb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2bc0: 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20  e page has.**   
2bd0: 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c    not yet been l
2be0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e  oaded from disk.
2bf0: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
2c00: 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a  content is just.
2c10: 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20  **     garbage. 
2c20: 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a   (Actually, we z
2c30: 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c  ero the content,
2c40: 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20   but you should 
2c50: 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20  not.**     make 
2c60: 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  any assumptions 
2c70: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2c80: 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29  t nevertheless.)
2c90: 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20    If the.**     
2ca0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
2cb0: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
2cc0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
2cd0: 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20  ad from the.**  
2ce0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61     original data
2cf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
2d00: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
2d10: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d30: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
2d40: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
2d50: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
2d60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2d90: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2da0: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
2db0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
2dc0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
2dd0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
2de0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72  .pgno */.  Pager
2df0: 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20  LruLink free;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e10: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66  t and previous f
2e20: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
2e30: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e50: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
2e60: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a  ages */.  u8 inJ
2e70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2e90: 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69   if has been wri
2ea0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
2eb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
2ee0: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
2ef0: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
2f00: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
2f30: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
2f40: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2f50: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f70: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2f80: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
2f90: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65   page */.  u8 ne
2fa0: 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20  edRead;         
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2fc0: 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67  d content if Pag
2fd0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
2fe0: 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  led */.  short i
2ff0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3010: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
3020: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
3030: 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72  dr *pDirty, *pPr
3040: 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44  evDirty;    /* D
3050: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69  irty pages */.#i
3060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3070: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
3080: 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c  MENT.  PagerLruL
3090: 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20  ink gfree;      
30a0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
30b0: 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20  list of nRef==0 
30c0: 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
30e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
30f0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
3100: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20  .  void *pData; 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a    /* Page data *
3130: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
3140: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
3150: 61 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  al data appended
3160: 20 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20   to this header 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
3180: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
3190: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
31a0: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
31b0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
31c0: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
31d0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
31e0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
31f0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
3200: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
3210: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
3220: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
3230: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
3250: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
3260: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
3270: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
3280: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
3290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
32a0: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
32b0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
32c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
32d0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
32e0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
32f0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
3300: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
3310: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
3320: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
3330: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
3340: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
3350: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
3360: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
3370: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
3380: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
3390: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
33a0: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
33b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
33c0: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
33d0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
33e0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
33f0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
3400: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
3410: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
3420: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
3430: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
3440: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
3450: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
3460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
3470: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3480: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
3490: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
34a0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
34b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
34c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
34d0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
3500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3510: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a  ubjournal */.};.
3520: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
3530: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
3540: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
3550: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
3560: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
3570: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
3580: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
3590: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
35a0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
35b0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
35c0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
35d0: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
35e0: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
35f0: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
3600: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
3610: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
3620: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
3630: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
3640: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3650: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
3660: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
3670: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
3680: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
3690: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
36a0: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
36b0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
36c0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
36d0: 5f 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29  _DATA(P)    ((P)
36e0: 2d 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65  ->pData).#define
36f0: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
3700: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
3710: 47 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  G)[1])).#define 
3720: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c  PGHDR_TO_HIST(P,
3730: 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20  PGR)  \.        
3740: 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a      ((PgHistory*
3750: 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b  )&((char*)(&(P)[
3760: 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74  1]))[(PGR)->nExt
3770: 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  ra])../*.** A op
3780: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
3790: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
37a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
37b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50  ructure..**.** P
37c0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
37d0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
37e0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
37f0: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f  CORRUPT, or.** o
3800: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
3810: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
3820: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
3830: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
3840: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
3850: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
3860: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
3870: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
3880: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
3890: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
38a0: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
38b0: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
38c0: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
38d0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
38e0: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
38f0: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
3900: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
3910: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
3920: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
3930: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
3940: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
3950: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
3960: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  Lookup().** APIs
3970: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
3980: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
3990: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
39a0: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
39b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
39c0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
39d0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
39e0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  r IO */.  u8 jou
39f0: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3a20: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3a30: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3a40: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3a50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3a60: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3a70: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3a80: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3aa0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ab0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3ac0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3ad0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3ae0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3af0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3b00: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3b10: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b30: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3b40: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3b50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3b60: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3b80: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
3b90: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
3ba0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
3bb0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
3bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
3bd0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
3be0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3bf0: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3c00: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3c10: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3c20: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3c30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3c40: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c60: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3c80: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
3c90: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3cb0: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
3cc0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
3cd0: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cf0: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
3d00: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
3d10: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
3d20: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
3d40: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
3d50: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
3d60: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3d80: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
3d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
3da0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
3dd0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3df0: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
3e20: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
3e30: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
3e40: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
3e50: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
3e60: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
3e70: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
3e80: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3eb0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ec0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
3ef0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
3f00: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
3f10: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f30: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3f40: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3f50: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3f60: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3f70: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3f80: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3f90: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3fa0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3fb0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3fd0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
3fe0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
3ff0: 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  es */.  u8 dbMod
4000: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
4010: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4020: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
4030: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
4040: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
4050: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
4060: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
4070: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
4080: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
4090: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40b0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
40c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
40d0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
4100: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
4110: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
4120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
4160: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4170: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
4180: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
4190: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
41a0: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
41c0: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
41d0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
41e0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
41f0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
4200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4210: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4220: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4230: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
4240: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4250: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4260: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4270: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
4290: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
42a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
42b0: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
42c0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
42d0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
42f0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
4300: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
4310: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
4320: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4340: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4350: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
4360: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
4370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
4380: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
4390: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
43a0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
43c0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
43d0: 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67  ry pages with Pg
43e0: 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20  Hdr.nRef>0 */.  
43f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4410: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4420: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
4430: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
4440: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
4450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4460: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
4470: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4480: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
4490: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
44a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
44b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
44c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
44d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e  */.  Bitvec *pIn
44e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
44f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4500: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4510: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
4520: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4550: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4560: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
45a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
45b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
45c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
45d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
45e0: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
45f0: 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  file *fd, *jfd; 
4600: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4610: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
4620: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
4630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4640: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
4650: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4660: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
4670: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4680: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
4690: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
46a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
46b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
46c0: 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75  er */.  PagerLru
46d0: 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20  List lru;       
46e0: 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20      /* LRU list 
46f0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
4700: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4720: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
4730: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
4740: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
4750: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4760: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
4770: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4780: 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  l */.  PgHdr *pD
4790: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
47a0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
47b0: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f  l dirty pages */
47c0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
47d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
47e0: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f  * Current byte o
47f0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
4800: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
4810: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4830: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4840: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4850: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74  ader */.  i64 st
4860: 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20  mtHdrOff;       
4870: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a        /* First j
4880: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
4890: 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65  itten this state
48a0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74  ment */.  i64 st
48b0: 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  mtCksum;        
48c0: 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e        /* cksumIn
48d0: 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e  it when statemen
48e0: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f  t was started */
48f0: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
4900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4910: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
4920: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
4930: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f  ) */.  int secto
4940: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4950: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4960: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4970: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66   rollback */.#if
4980: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4990: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
49a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
49b0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
49c0: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
49d0: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
49e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
49f0: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4a00: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4a10: 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  f.  void (*xDest
4a20: 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c  ructor)(DbPage*,
4a30: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
4a40: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
4a50: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
4a60: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
4a70: 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  ter)(DbPage*,int
4a80: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
4a90: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
4aa0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
4ab0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ac0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
4ad0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
4ae0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
4af0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
4b00: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
4b10: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
4b20: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
4b30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b40: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
4b50: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  ) */.#endif.  in
4b60: 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20  t nHash;        
4b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4b90: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  ash table */.  P
4ba0: 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20  gHdr **aHash;   
4bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4bc0: 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20  sh table to map 
4bd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50  page number to P
4be0: 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  gHdr */.#ifdef S
4bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4c00: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
4c10: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69  Doubly linked li
4c40: 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20  st of pagers on 
4c50: 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72  which */.  Pager
4c60: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
4c80: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
4c90: 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a  () will work */.
4ca0: 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69    volatile int i
4cb0: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 2f 2a  InUseMM;      /*
4cc0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61   Non-zero if una
4cd0: 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a  vailable to MM *
4ce0: 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  /.  volatile int
4cf0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4d00: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69  /* Non-zero if i
4d10: 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  n sqlite3_releas
4d20: 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65  e_memory() */.#e
4d30: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4d40: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4d50: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4d60: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4d70: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4d80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4d90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4da0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4db0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4dc0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
4dd0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
4de0: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
4df0: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
4e00: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
4e10: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   files */.};../*
4e20: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
4e30: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
4e40: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
4e50: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
4e60: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
4e70: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
4e80: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
4e90: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
4ea0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
4eb0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
4ec0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
4ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
4ee0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
4ef0: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
4f00: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
4f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
4f20: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
4f30: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
4f40: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
4f50: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
4f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
4f70: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
4f80: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
4f90: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
4fa0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
4fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
4fc0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
4fd0: 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  rnal */.int sqli
4fe0: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
4ff0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
5000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  * Number of cach
5010: 65 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f  e pages freed */
5020: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
5030: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
5040: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
5050: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
5060: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
5070: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70  owing variable p
5080: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61  oints to the hea
5090: 64 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69  d of a double-li
50a0: 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  nked list.** of 
50b0: 61 6c 6c 20 70 61 67 65 72 73 20 74 68 61 74 20  all pagers that 
50c0: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
50d0: 20 70 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62   page stealing b
50e0: 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  y the.** sqlite3
50f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
5100: 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63  ) interface.  Ac
5110: 63 65 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73  cess to this lis
5120: 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65  t is.** protecte
5130: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
5140: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5150: 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64  2 mutex..*/.#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5170: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5180: 4e 54 0a 73 74 61 74 69 63 20 50 61 67 65 72 20  NT.static Pager 
5190: 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  *sqlite3PagerLis
51a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61  t = 0;.static Pa
51b0: 67 65 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74  gerLruList sqlit
51c0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20  e3LruPageList = 
51d0: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69  {0, 0, 0};.#endi
51e0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  f.../*.** Journa
51f0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
5200: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
5210: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
5220: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
5230: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
5240: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
5250: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
5260: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
5270: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
5280: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
5290: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
52a0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
52b0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
52c0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
52d0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
52e0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
52f0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
5300: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5310: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5320: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5330: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5340: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5350: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5360: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5370: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
5380: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
5390: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
53a0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
53b0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
53c0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
53d0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
53e0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
53f0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5400: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5410: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5420: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5430: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5440: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5450: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5460: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5470: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
5480: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
5490: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
54a0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
54b0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
54c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
54d0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
54e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
54f0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5500: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5510: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5520: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5530: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5540: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5550: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5560: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5570: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
5580: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
5590: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
55a0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
55b0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
55c0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
55d0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
55e0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
55f0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5600: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5610: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5620: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5630: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5640: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5650: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5660: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5670: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
5680: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
5690: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
56a0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
56b0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
56c0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
56d0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
56e0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
56f0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5700: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5710: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5720: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5730: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5740: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5750: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5760: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5770: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
5780: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
5790: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
57a0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
57b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
57c0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
57d0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
57e0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
57f0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
5800: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5810: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
5820: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
5830: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
5840: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
5850: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
5860: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
5870: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
5880: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
5890: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
58a0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
58b0: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
58c0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
58d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
58e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
58f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
5900: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
5910: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
5920: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
5930: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
5940: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
5950: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
5960: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
5970: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
5980: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
5990: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
59a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
59b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
59c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
59d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
59e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
59f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
5a00: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
5a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5a20: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
5a30: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
5a40: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
5a50: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
5a60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65  ndif../*.** Page
5a70: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
5a80: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
5a90: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
5aa0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
5ab0: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
5ac0: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
5ad0: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
5ae0: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
5af0: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
5b00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
5b10: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
5b20: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
5b30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b40: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
5b50: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
5b60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5b70: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
5b80: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
5b90: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
5ba0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
5bb0: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
5bc0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
5bd0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
5be0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
5bf0: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
5c00: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
5c10: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
5c20: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
5c30: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
5c40: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
5c50: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
5c60: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
5c70: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
5c80: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
5c90: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
5ca0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
5cb0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e  *.** The pagerEn
5cc0: 74 65 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c  ter() and pagerL
5cd0: 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20  eave() routines 
5ce0: 61 63 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65  acquire and rele
5cf0: 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f  ase.** a mutex o
5d00: 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20 20 54  n each pager.  T
5d10: 68 65 20 6d 75 74 65 78 20 69 73 20 72 65 63 75  he mutex is recu
5d20: 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rsive..**.** Thi
5d30: 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70  s is a special-p
5d40: 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49  urpose mutex.  I
5d50: 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20  t only provides 
5d60: 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e  mutual exclusion
5d70: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
5d80: 42 74 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65  Btree and the Me
5d90: 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20  mory Management 
5da0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
5db0: 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63  memory().** func
5dc0: 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e  tion.  It does n
5dd0: 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20  ot prevent, for 
5de0: 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72  example, two Btr
5df0: 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ees from accessi
5e00: 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70  ng.** the same p
5e10: 61 67 65 72 20 61 74 20 74 68 65 20 73 61 6d 65  ager at the same
5e20: 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65   time.  Other ge
5e30: 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  neral-purpose mu
5e40: 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  texes in.** the 
5e50: 62 74 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64  btree layer hand
5e60: 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a  le that chore..*
5e70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5e80: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
5e90: 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69  NAGEMENT.  stati
5ea0: 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65  c void pagerEnte
5eb0: 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  r(Pager *p){.   
5ec0: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a   p->iInUseDB++;.
5ed0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73      if( p->iInUs
5ee0: 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65  eMM && p->iInUse
5ef0: 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e 64 65 66  DB==1 ){.#ifndef
5f00: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
5f10: 4f 50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  OP.      sqlite3
5f20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5f30: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5f40: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5f50: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5f60: 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66  IC_MEM2);.#endif
5f70: 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  .      p->iInUse
5f80: 44 42 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  DB = 0;.      sq
5f90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5fa0: 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  r(mutex);.      
5fb0: 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b  p->iInUseDB = 1;
5fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5fd0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
5fe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
5ff0: 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d  ert( p->iInUseMM
6000: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61  ==0 );.  }.  sta
6010: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65  tic void pagerLe
6020: 61 76 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ave(Pager *p){. 
6030: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d     p->iInUseDB--
6040: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
6050: 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a  >iInUseDB>=0 );.
6060: 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
6070: 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28 58 29  ne pagerEnter(X)
6080: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c  .# define pagerL
6090: 65 61 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a  eave(X).#endif..
60a0: 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70  /*.** Add page p
60b0: 50 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  Pg to the end of
60c0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
60d0: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72 75   managed by stru
60e0: 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28  cture.** pList (
60f0: 70 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20  pPg becomes the 
6100: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
6110: 65 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f 73  e list - the mos
6120: 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75  t recently .** u
6130: 73 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20 70  sed). Argument p
6140: 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e  Link should poin
6150: 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d  t to either pPg-
6160: 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66  >free or pPg->gf
6170: 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e  ree,.** dependin
6180: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67  g on whether pPg
6190: 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20   is being added 
61a0: 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65  to the pager-spe
61b0: 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62  cific or.** glob
61c0: 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a  al LRU list..*/.
61d0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74  static void list
61e0: 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73 74  Add(PagerLruList
61f0: 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72   *pList, PagerLr
6200: 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67  uLink *pLink, Pg
6210: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69  Hdr *pPg){.  pLi
6220: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  nk->pNext = 0;. 
6230: 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20   pLink->pPrev = 
6240: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23  pList->pLast;..#
6250: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6260: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6270: 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70  EMENT.  assert(p
6280: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65  Link==&pPg->free
6290: 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d   || pLink==&pPg-
62a0: 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72  >gfree);.  asser
62b0: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67  t(pLink==&pPg->g
62c0: 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26  free || pList!=&
62d0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
62e0: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  st);.#endif..  i
62f0: 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  f( pList->pLast 
6300: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
6310: 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20  = (char *)pLink 
6320: 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 20  - (char *)pPg;. 
6330: 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20     PagerLruLink 
6340: 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61  *pLastLink = (Pa
6350: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28  gerLruLink *)(&(
6360: 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61  (u8 *)pList->pLa
6370: 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  st)[iOff]);.    
6380: 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74  pLastLink->pNext
6390: 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b   = pPg;.  }else{
63a0: 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 4c 69  .    assert(!pLi
63b0: 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20 20  st->pFirst);.   
63c0: 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d   pList->pFirst =
63d0: 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69   pPg;.  }..  pLi
63e0: 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  st->pLast = pPg;
63f0: 0a 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e 70  .  if( !pList->p
6400: 46 69 72 73 74 53 79 6e 63 65 64 20 26 26 20 70  FirstSynced && p
6410: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
6420: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46  ){.    pList->pF
6430: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
6440: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6450: 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74  emove pPg from t
6460: 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  he list managed 
6470: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
6480: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
6490: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  List..**.** Argu
64a0: 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c  ment pLink shoul
64b0: 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65  d point to eithe
64c0: 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70  r pPg->free or p
64d0: 50 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65 6e  Pg->gfree, depen
64e0: 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74  ding .** on whet
64f0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
6500: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
6510: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 20  ger-specific or 
6520: 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e  global LRU list.
6530: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6540: 6c 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65 72  listRemove(Pager
6550: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6560: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6570: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6580: 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28  {.  int iOff = (
6590: 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28  char *)pLink - (
65a0: 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66  char *)pPg;..#if
65b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
65c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
65d0: 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69  ENT.  assert(pLi
65e0: 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c  nk==&pPg->free |
65f0: 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67  | pLink==&pPg->g
6600: 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28  free);.  assert(
6610: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72  pLink==&pPg->gfr
6620: 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71  ee || pList!=&sq
6630: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6640: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
6650: 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69   pPg==pList->pFi
6660: 72 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  rst ){.    pList
6670: 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b  ->pFirst = pLink
6680: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
6690: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
66a0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73  Last ){.    pLis
66b0: 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b  t->pLast = pLink
66c0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
66d0: 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  f( pLink->pPrev 
66e0: 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c  ){.    PagerLruL
66f0: 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d  ink *pPrevLink =
6700: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
6710: 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d  )(&((u8 *)pLink-
6720: 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a  >pPrev)[iOff]);.
6730: 20 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70      pPrevLink->p
6740: 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e  Next = pLink->pN
6750: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
6760: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Link->pNext ){. 
6770: 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20     PagerLruLink 
6780: 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61  *pNextLink = (Pa
6790: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28  gerLruLink *)(&(
67a0: 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65  (u8 *)pLink->pNe
67b0: 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  xt)[iOff]);.    
67c0: 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76  pNextLink->pPrev
67d0: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b   = pLink->pPrev;
67e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
67f0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6800: 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
6810: 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65   *p = pLink->pNe
6820: 78 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  xt;.    while( p
6830: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
6840: 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c 72  ){.      PagerLr
6850: 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67  uLink *pL = (Pag
6860: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
6870: 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a  u8 *)p)[iOff]);.
6880: 20 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e        p = pL->pN
6890: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
68a0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
68b0: 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70  ed = p;.  }..  p
68c0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
68d0: 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ink->pPrev = 0;.
68e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61  }../* .** Add pa
68f0: 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c 69  ge pPg to the li
6900: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6910: 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 20   for the pager. 
6920: 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61  If .** memory-ma
6930: 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
6940: 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74 68  led, also add th
6950: 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 67 6c  e page to the gl
6960: 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66  obal .** list of
6970: 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a   free pages..*/.
6980: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c  static void lruL
6990: 69 73 74 41 64 64 28 50 67 48 64 72 20 2a 70 50  istAdd(PgHdr *pP
69a0: 67 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26 70  g){.  listAdd(&p
69b0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c  Pg->pPager->lru,
69c0: 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67   &pPg->free, pPg
69d0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
69e0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
69f0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
6a00: 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65  !pPg->pPager->me
6a10: 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
6a20: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6a30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
6a40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6a50: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20  ATIC_LRU));.    
6a60: 6c 69 73 74 41 64 64 28 26 73 71 6c 69 74 65 33  listAdd(&sqlite3
6a70: 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50  LruPageList, &pP
6a80: 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a  g->gfree, pPg);.
6a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
6aa0: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
6ab0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
6ac0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6ad0: 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  U));.  }.#endif.
6ae0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65  }../* .** Remove
6af0: 20 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74   page pPg from t
6b00: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6b10: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73  pages for the as
6b20: 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a  sociated pager..
6b30: 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  ** If memory-man
6b40: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6b50: 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20  ed, also remove 
6b60: 70 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f  pPg from the glo
6b70: 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66  bal list.** of f
6b80: 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  ree pages..*/.st
6b90: 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73  atic void lruLis
6ba0: 74 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70  tRemove(PgHdr *p
6bb0: 50 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76  Pg){.  listRemov
6bc0: 65 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  e(&pPg->pPager->
6bd0: 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c  lru, &pPg->free,
6be0: 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51   pPg);.#ifdef SQ
6bf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6c00: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6c10: 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72  if( !pPg->pPager
6c20: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73  ->memDb ){.    s
6c30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6c40: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
6c50: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6c60: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6c70: 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26      listRemove(&
6c80: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6c90: 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c  st, &pPg->gfree,
6ca0: 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74   pPg);.    sqlit
6cb0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
6cc0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
6cd0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6ce0: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6cf0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6d00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6d10: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66  s called just af
6d20: 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ter the needSync
6d30: 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63   flag has been c
6d40: 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  leared.** from a
6d50: 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64  ll pages managed
6d60: 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61   by pPager (usua
6d70: 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  lly because the 
6d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
6d90: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79  has just been sy
6da0: 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65  nced). It update
6db0: 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72  s the pPager->lr
6dc0: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76  u.pFirstSynced v
6dd0: 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20  ariable.** and, 
6de0: 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
6df0: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6e00: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50   the sqlite3LruP
6e10: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6e20: 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65  nced.** variable
6e30: 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
6e40: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74   void lruListSet
6e50: 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65  FirstSynced(Page
6e60: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
6e70: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e80: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
6e90: 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66  >lru.pFirst;.#if
6ea0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6eb0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6ec0: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65  ENT.  if( !pPage
6ed0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6ee0: 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71  PgHdr *p;.    sq
6ef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6f00: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
6f10: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6f20: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6f30: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33     for(p=sqlite3
6f40: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6f50: 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  st; p && p->need
6f60: 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65 65  Sync; p=p->gfree
6f70: 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73 73  .pNext);.    ass
6f80: 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e 6c  ert(p==pPager->l
6f90: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  ru.pFirstSynced 
6fa0: 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72 75  || p==sqlite3Lru
6fb0: 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
6fc0: 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  ynced);.    sqli
6fd0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6fe0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
6ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
7000: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
7010: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
7020: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
7030: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
7040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7050: 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70   true if page *p
7060: 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  Pg has already b
7070: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
7080: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
7090: 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74  journal (or stat
70a0: 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68  ement snapshot h
70b0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  as been created,
70c0: 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74   if *pPg is part
70d0: 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d  .** of an in-mem
70e0: 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  ory database)..*
70f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7100: 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48  eInStatement(PgH
7110: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
7120: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
7130: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d  >pPager;.  if( M
7140: 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75  EMDB ){.    retu
7150: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  rn PGHDR_TO_HIST
7160: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69  (pPg, pPager)->i
7170: 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nStmt;.  }else{.
7180: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
7190: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
71a0: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
71b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  g->pgno);.  }.}.
71c0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
71d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
71e0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74  ger hash table t
71f0: 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20  o N.  N must be 
7200: 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77  a power.** of tw
7210: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
7220: 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68  d pager_resize_h
7230: 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20  ash_table(Pager 
7240: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b  *pPager, int N){
7250: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
7260: 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74  , *pPg;.  assert
7270: 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31  ( N>0 && (N&(N-1
7280: 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  ))==0 );.#ifdef 
7290: 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f  SQLITE_MALLOC_SO
72a0: 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20 4e  FT_LIMIT.  if( N
72b0: 2a 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d  *sizeof(aHash[0]
72c0: 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f  )>SQLITE_MALLOC_
72d0: 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  SOFT_LIMIT ){.  
72e0: 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f 4d 41 4c    N = SQLITE_MAL
72f0: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 2f 73  LOC_SOFT_LIMIT/s
7300: 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3b  izeof(aHash[0]);
7310: 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d 3d 70 50  .  }.  if( N==pP
7320: 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 20 72 65  ager->nHash ) re
7330: 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 70  turn;.#endif.  p
7340: 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
7350: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
7360: 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69  >aHash!=0 ) sqli
7370: 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e  te3FaultBeginBen
7380: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7390: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29  INJECTOR_MALLOC)
73a0: 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69  ;.  aHash = sqli
73b0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
73c0: 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a  izeof(aHash[0])*
73d0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  N );.  if( pPage
73e0: 72 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71  r->aHash!=0 ) sq
73f0: 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e  lite3FaultEndBen
7400: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7410: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29  INJECTOR_MALLOC)
7420: 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
7430: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48  Pager);.  if( aH
7440: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
7450: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
7460: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
7470: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
7480: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
7490: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
74a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
74b0: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
74c0: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
74d0: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
74e0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
74f0: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
7500: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7510: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
7520: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
7530: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
7540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
7550: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
7560: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
7570: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
7580: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7590: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
75a0: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
75b0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
75c0: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
75d0: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
75e0: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
75f0: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
7600: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
7610: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
7620: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
7630: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
7640: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
7650: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
7660: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
7670: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
7680: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
7690: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
76a0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
76b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
76c0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
76d0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
76e0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
76f0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
7700: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
7710: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
7720: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
7730: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
7740: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
7750: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
7760: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
7770: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7780: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
7790: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
77a0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
77b0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
77c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
77d0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
77e0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
77f0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
7800: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7810: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
7820: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
7830: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
7840: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
7850: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
7860: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
7870: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
7880: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
7890: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
78a0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
78b0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
78c0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
78d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
78e0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
78f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
7900: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7910: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
7920: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
7930: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
7940: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
7950: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
7960: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
7970: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
7980: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
7990: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
79a0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  et);.}../*.** If
79b0: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
79c0: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
79d0: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
79e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
79f0: 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
7a00: 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65  file *pFd, int e
7a10: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46  Lock){.  if( !pF
7a20: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7a30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7a40: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
7a50: 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  n sqlite3OsUnloc
7a60: 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  k(pFd, eLock);.}
7a70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7a80: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
7a90: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
7aa0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
7ab0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
7ac0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
7ad0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
7ae0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
7af0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
7b00: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
7b10: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7b20: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
7b30: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
7b40: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
7b50: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
7b60: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
7b70: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
7b80: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
7b90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
7ba0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
7bb0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
7bc0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
7bd0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
7be0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
7bf0: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
7c00: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
7c10: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
7c20: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
7c30: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7c40: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
7c50: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
7c60: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
7c70: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
7c80: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
7c90: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
7ca0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7cb0: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
7cc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
7cd0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
7ce0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
7cf0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   dc;           /
7d00: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
7d10: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  eristics */.  in
7d20: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
7d30: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
7d40: 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20  /.  int szPage; 
7d50: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7d60: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7d70: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7d80: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7d90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7da0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7db0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7dc0: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7dd0: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7de0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7df0: 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  );.    szPage = 
7e00: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7e10: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
7e20: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7e30: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
7e40: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
7e50: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
7e60: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
7e70: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
7e80: 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20  thods || .      
7e90: 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49   (dc & (SQLITE_I
7ea0: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
7eb0: 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63  age>>8)) && nSec
7ec0: 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a  tor<=szPage) ){.
7ed0: 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e      return JOURN
7ee0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7ef0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
7f00: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
7f10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
7f20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
7f30: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
7f40: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
7f50: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
7f60: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
7f70: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
7f80: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
7f90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7fa0: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
7fb0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
7fc0: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
7fd0: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
7fe0: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
7ff0: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
8000: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8010: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
8020: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8030: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8040: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
8050: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8060: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
8070: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
8080: 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46  UPT, or SQLITE_F
8090: 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ULL.** the error
80a0: 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
80b0: 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70  ent. Until the p
80c0: 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69  ersisten error i
80d0: 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75  s cleared,.** su
80e0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
80f0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
8100: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
8110: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
8120: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
8130: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73  ..**.** A persis
8140: 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63  tent error indic
8150: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
8160: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
8170: 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
8180: 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
8190: 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
81a0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
81b0: 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
81c0: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
81d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
81e0: 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
81f0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
8200: 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
8210: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
8220: 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20  r occured, then 
8230: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
8240: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
8250: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e   to be replayed.
8260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8270: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
8280: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61  er *pPager);.sta
8290: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
82a0: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
82b0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
82c0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
82d0: 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  f;.  assert(.   
82e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
82f0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
8300: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
8310: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
8320: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
8330: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
8340: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
8350: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
8360: 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  (.    rc2==SQLIT
8370: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63  E_FULL ||.    rc
8380: 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
8390: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
83a0: 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a  TE_CORRUPT.  ){.
83b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
83c0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  ode = rc;.    if
83d0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
83e0: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26  =PAGER_UNLOCK &&
83f0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
8400: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
8410: 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
8420: 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63  eady unlocked, c
8430: 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  all pager_unlock
8440: 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20  () now to.      
8450: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  ** clear the err
8460: 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73  or state and ens
8470: 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
8480: 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20  er-cache is .   
8490: 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
84a0: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f   empty..      */
84b0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
84c0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
84d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
84e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
84f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
8500: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
8510: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
8520: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
8530: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
8540: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
8550: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
8560: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
8570: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
8580: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
8590: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
85a0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
85b0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
85c0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
85d0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
85e0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
85f0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
8600: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
8610: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
8620: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
8630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8640: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
8650: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
8660: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
8670: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
8680: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
8690: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
86a0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
86b0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
86c0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
86d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20  er->pageSize, . 
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64         (unsigned
8700: 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f   char *)PGHDR_TO
8710: 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d  _DATA(pPage));.}
8720: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
8730: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
8740: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
8750: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
8760: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8770: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
8780: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
8790: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
87a0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
87b0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
87c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
87d0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
87e0: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
87f0: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
8800: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
8810: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
8820: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
8830: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
8840: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
8850: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
8860: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
8870: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
8880: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
8890: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
88a0: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
88b0: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
88c0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
88d0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
88e0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
88f0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
8900: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
8910: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
8920: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45  )  0.#define CHE
8930: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
8940: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
8950: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
8960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
8970: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
8980: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
8990: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
89a0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
89b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  read from the en
89c0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
89d0: 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  d .** written in
89e0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
89f0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
8a00: 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  . .**.** zMaster
8a10: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
8a20: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
8a30: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
8a40: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
8a50: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
8a60: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
8a70: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
8a80: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
8a90: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
8aa0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
8ab0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8ac0: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
8ad0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8ae0: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
8af0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
8b00: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
8b10: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
8b20: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
8b30: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
8b40: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
8b50: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
8b60: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
8b70: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
8b80: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
8b90: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
8ba0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
8bb0: 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65  s present zMaste
8bc0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
8bd0: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
8be0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
8bf0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
8c00: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
8c10: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
8c20: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
8c30: 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  int nMaster){.  
8c40: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
8c50: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
8c60: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
8c70: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
8c80: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
8c90: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
8ca0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
8cb0: 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65  der */..  zMaste
8cc0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
8cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
8ce0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
8cf0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
8d00: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c  QLITE_OK || szJ<
8d10: 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  16 ) return rc;.
8d20: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
8d30: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
8d40: 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  , &len);.  if( r
8d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8d60: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
8d70: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b   len>=nMaster ){
8d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8d90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
8da0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
8db0: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
8dc0: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
8dd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8de0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
8df0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
8e00: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
8e10: 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21  zJ-8);.  if( rc!
8e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65  =SQLITE_OK || me
8e30: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
8e40: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
8e50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
8e60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
8e70: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
8e80: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
8e90: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
8ea0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8eb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8ec0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
8ed0: 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69  \0';..  /* See i
8ee0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
8ef0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
8f00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
8f10: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
8f20: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
8f30: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69  sum -= zMaster[i
8f40: 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b  ];.   }.  if( ck
8f50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
8f60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
8f70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
8f80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
8f90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
8fa0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
8fb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
8fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
8fd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
8fe0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
8ff0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
9000: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
9010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
9020: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
9030: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
9040: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
9050: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  e..    */.    zM
9060: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
9070: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
9080: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9090: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
90a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
90b0: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
90c0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
90d0: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
90e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
90f0: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
9100: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
9110: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
9120: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
9130: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
9140: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
9150: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
9160: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
9170: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
9180: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
9190: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
9200: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
9220: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
9230: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
9240: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
9250: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
9260: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9270: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
9280: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
9290: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
92a0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
92b0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
92c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
92d0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
92e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
92f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
9300: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
9310: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9320: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9330: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
9340: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
9350: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
9360: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
9370: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9380: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  f = offset;.}../
9390: 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73  *.** Write zeros
93a0: 20 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72   over the header
93b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
93c0: 66 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20  file.  This has 
93d0: 74 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66  the.** effect of
93e0: 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
93f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
9400: 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68  nd committing th
9410: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
9420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9430: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
9440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
9450: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
9460: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9470: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
9480: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
9490: 5b 32 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61  [28];..  if( pPa
94a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
94b0: 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69  ){.    i64 iLimi
94c0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
94d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20  nalSizeLimit;.. 
94e0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
94f0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
9500: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
9510: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
9520: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
9530: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
9540: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
9550: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
9560: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9570: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9580: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
9590: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
95a0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
95b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
95c0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
95d0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
95e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
95f0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
9600: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
9610: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
9620: 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  _flags);.    }..
9630: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
9640: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
9650: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
9660: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
9670: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
9680: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
9690: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
96a0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
96b0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
96c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
96d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
96e0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
96f0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
9700: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
9710: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
9720: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
9730: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
9740: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
9750: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
9760: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
9770: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
9780: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
9790: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
97a0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
97b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
97c0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
97d0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
97e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
97f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
9800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
9810: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
9820: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9830: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
9840: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
9850: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9860: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9870: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
9880: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
9890: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
98a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
98b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
98c0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
98d0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
98e0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
98f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
9900: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
9910: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
9920: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
9930: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9940: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
9950: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
9960: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
9970: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
9980: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9990: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
99a0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
99b0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
99c0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
99d0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
99e0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
99f0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
9a00: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
9a10: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
9a20: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
9a30: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
9a40: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
9a50: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
9a60: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
9a70: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
9a80: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
9a90: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
9aa0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
9ab0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
9ac0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
9ad0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
9ae0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
9af0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
9b00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9b10: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
9b20: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
9b30: 61 63 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  ace;.  int nHead
9b40: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
9b50: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72  eSize;.  int nWr
9b60: 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61  ite;..  if( nHea
9b70: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
9b80: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
9b90: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
9ba0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9bb0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
9bc0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
9bd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
9be0: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
9bf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c00: 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b  Off;.  }..  seek
9c10: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
9c20: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  r);.  pPager->jo
9c30: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
9c40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
9c50: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
9c60: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
9c70: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
9c80: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
9c90: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
9ca0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
9cb0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
9cc0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
9cd0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
9ce0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
9cf0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
9d00: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
9d10: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
9d20: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
9d30: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
9d40: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
9d50: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
9d60: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
9d70: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
9d80: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
9d90: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
9da0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
9db0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
9dc0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
9dd0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
9de0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
9df0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
9e00: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
9e10: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
9e20: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
9e30: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
9e40: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
9e50: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
9e60: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
9e70: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
9e80: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
9e90: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
9ea0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
9eb0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
9ec0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
9ed0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
9ee0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
9ef0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
9f00: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
9f10: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
9f20: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
9f30: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
9f40: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
9f50: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
9f60: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
9f70: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
9f80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
9f90: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
9fa0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
9fb0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
9fc0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
9fd0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
9fe0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
9ff0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
a000: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
a010: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
a020: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
a030: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
a040: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
a050: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
a060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
a070: 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  */.  assert(pPag
a080: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
a090: 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ||pPager->noSync
a0a0: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
a0b0: 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c  ->noSync) .   ||
a0c0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a0d0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a0e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
a0f0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
a100: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
a110: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
a120: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
a130: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
a140: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
a150: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
a160: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
a170: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
a180: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   0);.  }..  /* T
a190: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
a1a0: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
a1b0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
a1c0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
a1d0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
a1e0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
a1f0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
a200: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
a210: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a220: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
a230: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
a240: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
a250: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
a260: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
a270: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
a280: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
a290: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
a2a0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
a2b0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
a2c0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
a2d0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
a2e0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
a2f0: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
a300: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a310: 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze);.  if( pPage
a320: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30  r->journalHdr==0
a330: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
a340: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
a350: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a360: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a370: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
a380: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a390: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69  .  }..  for(nWri
a3a0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
a3b0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
a3c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a3d0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
a3e0: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
a3f0: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
a400: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
a410: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
a420: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
a430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a440: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
a450: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
a460: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
a470: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50  rnalOff);.    pP
a480: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a490: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
a4a0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
a4b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
a4c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
a4d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
a4e0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
a4f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a500: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
a510: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
a520: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
a530: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
a540: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
a550: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
a560: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
a570: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
a580: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
a590: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
a5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
a5b0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
a5c0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
a5d0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
a5e0: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
a5f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
a600: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
a610: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
a620: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
a630: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
a640: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
a650: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
a660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
a670: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
a680: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
a690: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
a6a0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
a6b0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a6c0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
a6d0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
a6e0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
a6f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
a700: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
a710: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
a720: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
a730: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
a740: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
a750: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
a760: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
a770: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
a780: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
a790: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a7a0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
a7b0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
a7c0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
a7d0: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
a7e0: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
a7f0: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
a800: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
a810: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
a820: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
a830: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
a840: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
a850: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
a860: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
a870: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
a880: 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67  lOff;.  int iPag
a890: 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f  eSize;..  seekJo
a8a0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
a8b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
a8c0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
a8d0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a8e0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
a8f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a900: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
a910: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
a920: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
a930: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a940: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
a950: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
a960: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
a970: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
a980: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
a990: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
a9a0: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
a9b0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
a9c0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
a9d0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
a9e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a9f0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
aa00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
aa10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
aa20: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
aa30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
aa40: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
aa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
aa60: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
aa70: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
aa80: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
aa90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
aaa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
aab0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
aac0: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
aad0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
aae0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
aaf0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
ab00: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36  >jfd, jrnlOff+16
ab10: 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53  , (u32 *)&iPageS
ab20: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
ab30: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
ab40: 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   iPageSize>=512 
ab50: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
ab60: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
ab70: 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28  E_SIZE .   && ((
ab80: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
ab90: 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b  geSize)==0 .  ){
aba0: 0a 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a  .    u16 pagesiz
abb0: 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20  e = iPageSize;. 
abc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
abd0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
abe0: 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a  pPager, &pagesiz
abf0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
ac00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
ac10: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
ac20: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
ac30: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
ac40: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
ac50: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
ac60: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
ac70: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
ac80: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
ac90: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
aca0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
acb0: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
acc0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
acd0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
ace0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
acf0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
ad00: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
ad10: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
ad20: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
ad30: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
ad40: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
ad50: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
ad60: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
ad70: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
ad80: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
ad90: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
ada0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
adb0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
adc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
add0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ade0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
adf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
ae00: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
ae10: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
ae20: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
ae30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
ae40: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
ae50: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
ae60: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
ae70: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
ae80: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
ae90: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
aea0: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
aeb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
aec0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
aed0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
aee0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
aef0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
af00: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
af10: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
af20: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
af30: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
af40: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
af50: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
af60: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
af70: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
af80: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
af90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
afa0: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
afb0: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
afc0: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
afd0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
afe0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
aff0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
b000: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
b010: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
b020: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
b030: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
b040: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
b050: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
b060: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
b070: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
b080: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
b090: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
b0a0: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
b0b0: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
b0c0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
b0d0: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
b0e0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
b0f0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
b100: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
b110: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
b120: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
b130: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a  jrnlOff;.  i64 j
b140: 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63  rnlSize;.  u32 c
b150: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
b160: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
b170: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
b180: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
b190: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
b1a0: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
b1b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
b1c0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
b1d0: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
b1e0: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
b1f0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
b200: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
b210: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
b220: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
b230: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
b240: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
b250: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
b260: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
b270: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
b280: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
b290: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
b2a0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
b2b0: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
b2c0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
b2d0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
b2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
b2f0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
b300: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
b310: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
b320: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
b330: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
b340: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
b350: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
b360: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
b370: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b380: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
b390: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
b3a0: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
b3b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
b3c0: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
b3d0: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
b3e0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b3f0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
b400: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
b410: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b420: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b430: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
b440: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
b450: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
b460: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
b470: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
b480: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
b490: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
b4a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b4b0: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
b4c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
b4d0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
b4e0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
b4f0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
b500: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38  ;.  jrnlOff += 8
b510: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
b520: 4d 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72  Magic);.  pPager
b530: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
b540: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
b550: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
b560: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
b570: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
b580: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
b590: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
b5a0: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
b5b0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
b5c0: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
b5d0: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
b5e0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
b5f0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
b600: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
b610: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
b620: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
b630: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
b640: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
b650: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
b660: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
b670: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
b680: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
b690: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
b6a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
b6c0: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
b6d0: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
b6e0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
b6f0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
b700: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
b710: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
b720: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
b730: 20 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d    */ .  if( (rc=
b740: 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26  =SQLITE_OK).   &
b750: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
b760: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
b770: 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
b780: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
b790: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e   && jrnlSize>jrn
b7a0: 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
b7b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
b7c0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
b7d0: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a  , jrnlOff);.  }.
b7e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b7f0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
b800: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
b810: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
b820: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
b830: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
b840: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
b850: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
b860: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
b870: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
b880: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
b890: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
b8a0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
b8b0: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
b8c0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
b8d0: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
b8e0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
b8f0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
b900: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
b910: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
b920: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
b930: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
b940: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b950: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
b960: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
b970: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
b980: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b990: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b9a0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
b9b0: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
b9c0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
b9d0: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
b9e0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
b9f0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
ba00: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
ba10: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
ba20: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
ba30: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
ba40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
ba50: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
ba60: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
ba70: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
ba80: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
ba90: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
baa0: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
bab0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
bac0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
bad0: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
bae0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
baf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
bb00: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
bb10: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
bb20: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
bb30: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
bb40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
bb50: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
bb60: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
bb70: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
bb80: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
bb90: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
bba0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
bbb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
bbc0: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
bbd0: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
bbe0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
bbf0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
bc00: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
bc10: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
bc20: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
bc30: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
bc40: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
bc50: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
bc60: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
bc70: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
bc80: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
bc90: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
bca0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
bcb0: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
bcc0: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
bcd0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
bce0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
bcf0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
bd00: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
bd10: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
bd20: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
bd30: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
bd40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bd50: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
bd60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
bd70: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
bd80: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
bd90: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
bda0: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
bdb0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
bdc0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
bdd0: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
bde0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bdf0: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
be00: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
be10: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
be20: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
be30: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
be40: 78 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69  xtAll;.    lruLi
be50: 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20  stRemove(pPg);. 
be60: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
be70: 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  ee(pPg->pData);.
be80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
be90: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73  (pPg);.  }.  ass
bea0: 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
beb0: 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73  pFirst==0);.  as
bec0: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
bed0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  .pFirstSynced==0
bee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
bef0: 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30  er->lru.pLast==0
bf00: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  );.  pPager->pSt
bf10: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  mt = 0;.  pPager
bf20: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  ->pAll = 0;.  pP
bf30: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
bf40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  ;.  pPager->nHas
bf50: 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  h = 0;.  sqlite3
bf60: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
bf70: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
bf80: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
bf90: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a  ger->aHash = 0;.
bfa0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
bfb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
bfc0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
bfd0: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
bfe0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
bff0: 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72  rrently in error
c000: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20   state, discard 
c010: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c020: 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e  .** the cache an
c030: 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65  d reset the Page
c040: 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65  r structure inte
c050: 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74  rnal state. If t
c060: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70  here is.** an op
c070: 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c  en journal-file,
c080: 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74   then the next t
c090: 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  ime a shared-loc
c0a0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  k is obtained.**
c0b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69   on the pager fi
c0c0: 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61  le (by this or a
c0d0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c0e0: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  ), it will be.**
c0f0: 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f   treated as a ho
c100: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
c110: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
c120: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c130: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
c140: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
c150: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c160: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
c170: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69  MEMDB ){.      i
c180: 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b  nt rc = osUnlock
c190: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
c1a0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c1b0: 20 72 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72   rc ) pPager->er
c1c0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
c1d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
c1e0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
c1f0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
c200: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
c210: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63       /* Always c
c220: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
c230: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
c240: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
c250: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   lock..      ** 
c260: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
c270: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
c280: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
c290: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
c2a0: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
c2b0: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
c2c0: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 20 20 2a  nder us..      *
c2d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
c2e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
c2f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c300: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c310: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
c320: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c330: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pen = 0;.       
c340: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
c350: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
c360: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  nJournal);.     
c370: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
c380: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
c390: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
c3a0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c3b0: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c3c0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c3d0: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c3e0: 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64        ** trusted
c3f0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
c400: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
c410: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
c420: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nts of the.     
c430: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
c440: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
c450: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
c460: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
c470: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
c480: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c490: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c4a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c4b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c4c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c4d0: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
c4e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
c4f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c500: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
c510: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c520: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
c530: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c540: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c550: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
c560: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
c570: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
c580: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c590: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
c5a0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
c5b0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
c5c0: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Use = 0;.       
c5d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c5e0: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
c5f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c600: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c610: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
c620: 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
c630: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f         pPager->o
c640: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
c650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c660: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20    if( !MEMDB || 
c670: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
c680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c690: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c6a0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
c6b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
c6c0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
c6d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c6e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
c6f0: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
c700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
c710: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
c720: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
c730: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
c740: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
c750: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
c760: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
c770: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
c780: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
c790: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
c7a0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
c7b0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 2f 2a  (Pager *p){.  /*
c7c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
c7d0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
c7e0: 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  D || p->journalO
c7f0: 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 69  pen==0 ); */.  i
c800: 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  f( p->errCode==S
c810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73  QLITE_OK && p->s
c820: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
c830: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
c840: 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e  te3FaultBeginBen
c850: 69 67 6e 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ign(-1);.    sql
c860: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
c870: 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k(p);.    sqlite
c880: 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28  3FaultEndBenign(
c890: 2d 31 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  -1);.  }.  pager
c8a0: 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23 69 66 20  _unlock(p);.#if 
c8b0: 30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  0.  assert( p->e
c8c0: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f  rrCode || !p->jo
c8d0: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d  urnalOpen || (p-
c8e0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26  >exclusiveMode&&
c8f0: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  !p->journalOff) 
c900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c910: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73  errCode || !p->s
c920: 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78  tmtOpen || p->ex
c930: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 23  clusiveMode );.#
c940: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
c950: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
c960: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
c970: 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
c980: 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65  s ended by eithe
c990: 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72  r.** a COMMIT or
c9a0: 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a   a ROLLBACK..**.
c9b0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
c9c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
c9d0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
c9e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c9f0: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
ca00: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
ca10: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
ca20: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
ca30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65  outine will rele
ca40: 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ase.** the datab
ca50: 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ase lock and acq
ca60: 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c  uires a SHARED l
ca70: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
ca80: 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74   if that is.** t
ca90: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  he appropriate t
caa0: 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c  hing to do.  Rel
cab0: 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c  ease locks usual
cac0: 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ly is appropriat
cad0: 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20  e,.** unless we 
cae0: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
caf0: 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20   access mode or 
cb00: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
cb10: 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20   .** COMMIT AND 
cb20: 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43  BEGIN or ROLLBAC
cb30: 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72  K AND BEGIN oper
cb40: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
cb50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
cb60: 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20   either deleted 
cb70: 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a  or truncated..**
cb80: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
cb90: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
cba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
cbb0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
cbc0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
cbd0: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
cbe0: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
cbf0: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
cc00: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
cc10: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
cc20: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
cc30: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
cc40: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
cc50: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
cc60: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
cc70: 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20  aster){.  PgHdr 
cc80: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
cc90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cca0: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
ccb0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  K;.  assert( !ME
ccc0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
ccd0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
cce0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
cd10: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
cd20: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
cd30: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
cd40: 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
cd50: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
cd60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cd70: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
cd80: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
cd90: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
cda0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
cdb0: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66  alOpen ){.    if
cdc0: 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
cdd0: 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c  iveMode .     ||
cde0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cdf0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ce00: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
ce10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
ce20: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
ce30: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
ce40: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
ce50: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
ce60: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
ce70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
ce80: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
ce90: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
cea0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
ceb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
cec0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
ced0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
cee0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
cef0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
cf00: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
cf10: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
cf20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cf30: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
cf40: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
cf50: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
cf60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cf70: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
cf80: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
cf90: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
cfa0: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
cfb0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
cfc0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
cfd0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
cfe0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
cff0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
d000: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
d010: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
d020: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
d030: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
d040: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
d050: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
d060: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
d070: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
d080: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d090: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
d0a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
d0b0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
d0c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
d0d0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
d0e0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
d0f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
d100: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
d110: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
d120: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
d130: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
d140: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
d150: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
d160: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
d170: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
d180: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
d190: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
d1a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
d1b0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
d1c0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d1d0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
d1e0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
d1f0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
d200: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
d210: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
d220: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
d230: 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69  ;.  lruListSetFi
d240: 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
d250: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
d260: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
d270: 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
d280: 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
d290: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
d2a0: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  :rc);.}../*.** C
d2b0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
d2c0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
d2d0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
d2e0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
d2f0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
d300: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
d310: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
d320: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
d330: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
d340: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
d350: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
d360: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
d370: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
d380: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
d390: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
d3a0: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
d3b0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
d3c0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
d3d0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
d3e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
d3f0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
d400: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
d410: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
d420: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
d430: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
d440: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
d450: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
d460: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
d470: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
d480: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
d490: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
d4a0: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
d4b0: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
d4c0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
d4d0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
d4e0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
d4f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
d500: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
d510: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
d520: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
d530: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
d540: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
d550: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
d560: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
d570: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
d580: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
d590: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
d5a0: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
d5b0: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
d5c0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
d5d0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
d5e0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
d5f0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
d600: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
d610: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
d620: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
d630: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
d640: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
d650: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
d660: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
d670: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
d680: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
d690: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
d6a0: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
d6b0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
d6c0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
d6d0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
d6e0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
d6f0: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
d700: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d710: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
d720: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
d730: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
d740: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
d750: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
d760: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
d770: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
d780: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
d790: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
d7a0: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
d7b0: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
d7c0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
d7d0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
d7e0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
d7f0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d800: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
d810: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
d820: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
d830: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
d840: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
d850: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
d860: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
d870: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
d880: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
d890: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
d8a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d8b0: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
d8c0: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
d8d0: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
d8e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
d8f0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d900: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
d910: 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ger, .  sqlite3_
d920: 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34  file *jfd,.  i64
d930: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75   offset,.  int u
d940: 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  seCksum.){.  int
d950: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
d960: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
d970: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
d980: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
d990: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
d9a0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
d9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d9c0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
d9d0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
d9e0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
da10: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
da20: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
da30: 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29   *aData = (u8 *)
da40: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
da50: 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  e;   /* Temp sto
da60: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
da70: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
da80: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
da90: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
daa0: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
dab0: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
dac0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
dad0: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
dae0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
daf0: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
db00: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
db10: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
db20: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
db30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  );.  assert( aDa
db40: 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  ta );..  rc = re
db50: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
db60: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
db70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
db80: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
db90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
dba0: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
dbb0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
dbc0: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
dbd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dbe0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dbf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dc00: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
dc10: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
dc20: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
dc30: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
dc40: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
dc50: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
dc60: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
dc70: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
dc80: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
dc90: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
dca0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
dcb0: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
dcc0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
dcd0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
dce0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
dcf0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
dd00: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
dd10: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
dd20: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
dd30: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
dd40: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
dd50: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
dd60: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
dd70: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
dd90: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
dda0: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
ddb0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
ddc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ddd0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
dde0: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
ddf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
de00: 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67  jfd, offset+pPag
de10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
de20: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
de30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
de40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
de50: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
de60: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
de70: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
de80: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
de90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
dea0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
deb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
dec0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
ded0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
dee0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
def0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
df00: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
df10: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
df20: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
df30: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
df40: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
df50: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
df60: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
df70: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
df80: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
df90: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
dfa0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
dfb0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
dfc0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
dfd0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
dfe0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
dff0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
e000: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
e010: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
e020: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
e030: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
e040: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
e050: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
e060: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
e070: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
e080: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
e090: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
e0a0: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
e0b0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
e0c0: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
e0d0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
e0e0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
e0f0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
e100: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
e110: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
e120: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
e130: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
e140: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
e150: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
e160: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
e170: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
e180: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e190: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
e1a0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
e1b0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
e1c0: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
e1d0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
e1e0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
e1f0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
e200: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
e210: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
e220: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
e230: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
e240: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
e250: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
e260: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
e270: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
e280: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
e290: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
e2a0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
e2b0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
e2c0: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
e2d0: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
e2e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
e2f0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
e300: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
e310: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
e320: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
e330: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
e340: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
e350: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
e360: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
e370: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
e380: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
e390: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
e3a0: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
e3b0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
e3c0: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
e3d0: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
e3e0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e3f0: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
e400: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
e410: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
e420: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
e430: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
e440: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
e450: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
e460: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
e470: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
e480: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
e490: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
e4a0: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
e4b0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
e4c0: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
e4d0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
e4e0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
e4f0: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
e500: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
e510: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
e520: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
e530: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
e540: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
e550: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
e560: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
e570: 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
e580: 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
e590: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
e5a0: 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
e5b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
e5c0: 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
e5d0: 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
e5e0: 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
e5f0: 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
e600: 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
e610: 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
e620: 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
e630: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
e640: 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
e650: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
e660: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
e670: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
e680: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
e690: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
e6a0: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
e6c0: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
e6d0: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
e6e0: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
e6f0: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
e700: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
e710: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e720: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
e730: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
e740: 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 50 61  ).        && pPa
e750: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
e760: 73 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  s ){.    i64 off
e770: 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
e780: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
e790: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
e7a0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
e7b0: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
e7c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e7d0: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
e7e0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
e7f0: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
e800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e810: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
e820: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
e830: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
e840: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
e850: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
e860: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
e870: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
e880: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
e890: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
e8a0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
e8b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
e8c0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
e8d0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
e8e0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
e8f0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
e900: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
e910: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
e920: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
e930: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
e940: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
e950: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
e960: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
e970: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
e980: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
e990: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
e9a0: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
e9b0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
e9c0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
e9d0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e9e0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
e9f0: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
ea00: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
ea10: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
ea20: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
ea30: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
ea40: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ea50: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
ea60: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
ea70: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
ea80: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
ea90: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
eaa0: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
eab0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
eac0: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
ead0: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
eae0: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
eaf0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
eb00: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
eb10: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
eb20: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
eb30: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
eb40: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
eb50: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
eb60: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
eb70: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
eb80: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
eb90: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
eba0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
ebb0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
ebc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ebd0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
ebe0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
ebf0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
ec00: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
ec10: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
ec20: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
ec30: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
ec40: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
ec50: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
ec60: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
ec70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
ec80: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
ec90: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
eca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ecb0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
ecc0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
ecd0: 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
ece0: 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
ecf0: 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
ed00: 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
ed10: 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
ed20: 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
ed30: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
ed40: 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ..**.**.** The m
ed50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ed60: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
ed70: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
ed80: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
ed90: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
eda0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
edb0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
edc0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
edd0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
ede0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
edf0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
ee00: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
ee10: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
ee20: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
ee30: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
ee40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
ee50: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
ee60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ee70: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
ee80: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
ee90: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
eea0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
eeb0: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
eec0: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
eed0: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
eee0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
eef0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
ef00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
ef10: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
ef20: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
ef30: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
ef40: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ef50: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
ef60: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
ef70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ef80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ef90: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
efa0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
efb0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
efc0: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
efd0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
efe0: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
eff0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
f000: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
f010: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
f020: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
f030: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
f040: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
f050: 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d  ite3Malloc(pVfs-
f060: 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
f070: 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
f080: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
f090: 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
f0a0: 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
f0b0: 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
f0c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f0d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
f0e0: 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  e{.    int flags
f0f0: 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
f100: 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
f110: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
f120: 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
f130: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
f140: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
f150: 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
f160: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
f170: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
f180: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
f190: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b  master_open = 1;
f1a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
f1b0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
f1c0: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
f1d0: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
f1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
f1f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f200: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
f210: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
f220: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
f230: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
f240: 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ptr = 0;.    int
f250: 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50   nMasterPtr = pP
f260: 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
f270: 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
f280: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
f290: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f2a0: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
f2b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
f2c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
f2d0: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
f2e0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
f2f0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
f300: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
f310: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
f320: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73  lite3Malloc(nMas
f330: 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
f340: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66  sterPtr);.    if
f350: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
f360: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
f370: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f380: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f390: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
f3a0: 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
f3b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
f3c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a  MasterJournal];.
f3d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f3e0: 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
f3f0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
f400: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
f410: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
f420: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
f430: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f440: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
f450: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
f460: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
f470: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
f480: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
f490: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
f4a0: 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
f4b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
f4c0: 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
f4d0: 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
f4e0: 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
f4f0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
f500: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f510: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f520: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f530: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
f540: 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
f550: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
f560: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
f570: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
f580: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
f590: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
f5a0: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
f5b0: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
f5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
f5d0: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
f5e0: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
f5f0: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
f600: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f610: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
f620: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
f630: 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
f640: 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
f650: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
f660: 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
f670: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f680: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
f690: 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
f6a0: 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
f6b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f6c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f6d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
f6e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f6f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f700: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
f710: 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
f720: 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
f730: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
f740: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
f750: 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
f760: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f780: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
f790: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
f7a0: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
f7b0: 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
f7c0: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
f7d0: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
f7e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
f7f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
f800: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
f810: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
f820: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f830: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
f840: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
f850: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
f860: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f870: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
f880: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
f890: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
f8a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f8b0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f8c0: 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
f8d0: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
f8e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
f8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
f900: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
f910: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
f920: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
f930: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f940: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
f950: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f960: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
f970: 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  n rc;.}...static
f980: 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e   void pager_trun
f990: 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72  cate_cache(Pager
f9a0: 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a   *pPager);../*.*
f9b0: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
f9c0: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
f9d0: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
f9e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
f9f0: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
fa00: 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74   Also truncate t
fa10: 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73  he cached repres
fa20: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
fa30: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68  file..**.** Migh
fa40: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
fa50: 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
fa60: 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
fa70: 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e  ller than nPage.
fa80: 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70  .** This can hap
fa90: 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
faa0: 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 74  , if we are in t
fab0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74  he middle of a t
fac0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  ransaction.** wh
fad0: 69 63 68 20 68 61 73 20 65 78 74 65 6e 64 65 64  ich has extended
fae0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61   the file size a
faf0: 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  nd the new pages
fb00: 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68   are still all h
fb10: 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c  eld.** in cache,
fb20: 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20   then an INSERT 
fb30: 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73 20 61  or UPDATE does a
fb40: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
fb50: 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70  ack.  Some.** op
fb60: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
fb70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
fb80: 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
fb90: 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a  if you try to.**
fba0: 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
fbb0: 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
fbc0: 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
fbd0: 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69  n it currently i
fbe0: 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20  s,.** so detect 
fbf0: 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
fc00: 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
fc10: 6f 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  o byte to the en
fc20: 64 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20  d of the new.** 
fc30: 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  file instead..*/
fc40: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fc50: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
fc60: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
fc70: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
fc80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
fc90: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
fca0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
fcb0: 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
fcc0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
fcd0: 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
fce0: 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63   newSize;.    rc
fcf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
fd00: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
fd10: 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
fd20: 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
fd30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
fd40: 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
fd50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fd60: 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
fd70: 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
fd80: 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
fd90: 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
fda0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fdb0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
fdc0: 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
fdd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fde0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
fdf0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
fe00: 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
fe10: 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
fe20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
fe30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fe40: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
fe50: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
fe60: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
fe70: 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
fe80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fe90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fea0: 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f  he sectorSize fo
feb0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
fec0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  r..**.** The sec
fed0: 74 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c  tor size is at l
fee0: 65 61 73 74 20 61 73 20 62 69 67 20 61 73 20 74  east as big as t
fef0: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72  he sector size r
ff00: 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71  eported.** by sq
ff10: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
ff20: 65 28 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75  e().  The minimu
ff30: 6d 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  m sector size is
ff40: 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
ff50: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
ff60: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
ff70: 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  ){.  assert(pPag
ff80: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
ff90: 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
ffa0: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
ffb0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
ffc0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
ffd0: 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
ffe0: 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
fff0: 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
10000 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
10010 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
10020 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
10030 63 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  cih case the OsS
10040 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
10050 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
10060 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
10070 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10080 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
10090 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
100a0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
100b0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
100c0 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
100d0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
100e0 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a  ze = 512;.  }.}.
100f0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
10100 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
10110 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
10120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
10130 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
10140 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
10150 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
10160 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
10170 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
10180 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
10190 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
101a0 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
101b0 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
101c0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
101d0 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
101e0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
101f0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
10200 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
10210 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
10220 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
10230 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
10240 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
10250 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
10260 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
10270 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
10280 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
10290 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
102a0 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
102b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
102c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
102d0 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
102e0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
102f0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
10300 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
10310 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
10320 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10330 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
10340 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
10350 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
10360 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
10370 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
10380 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
10390 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
103a0 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
103b0 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
103c0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
103d0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
103e0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
103f0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
10400 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63  ch is the page c
10410 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20  ase..**  (7)  4 
10420 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
10430 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
10440 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
10450 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10460 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
10470 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
10480 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
10490 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
104a0 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
104b0 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
104c0 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  8)  N bytes of t
104d0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
104e0 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
104f0 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
10500 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
10510 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
10520 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
10530 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
10540 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
10550 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
10560 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
10570 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
10580 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
10590 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
105a0 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
105b0 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
105c0 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
105d0 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (9)  Zero or mor
105e0 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
105f0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
10600 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
10610 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
10620 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
10630 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
10640 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
10650 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
10660 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
10670 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
10680 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
10690 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
106a0 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74  n the first 8 it
106b0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
106c0 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
106d0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
106e0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74  stance of the 9t
106f0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
10700 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
10710 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
10720 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
10730 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
10740 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
10750 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
10760 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
10770 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
10780 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
10790 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
107a0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
107b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
107c0 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
107d0 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
107e0 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
107f0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
10800 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
10810 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
10820 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
10830 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10840 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
10850 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
10860 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
10870 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
10880 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
10890 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
108a0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
108b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
108c0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
108d0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
108e0 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
108f0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
10900 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
10910 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
10920 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
10930 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
10940 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
10950 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
10960 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
10970 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
10980 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
10990 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
109a0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
109b0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
109c0 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
109d0 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
109e0 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
109f0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
10a00 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
10a10 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
10a20 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
10a30 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
10a40 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
10a50 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
10a60 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
10a70 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
10a80 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
10a90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
10aa0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
10ab0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
10ac0 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
10ad0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10ae0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
10af0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
10b00 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
10b10 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
10b20 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
10b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
10b40 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
10b50 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
10b60 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
10b70 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
10b80 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
10b90 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
10ba0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
10bb0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
10bc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
10bd0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
10be0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
10bf0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
10c00 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
10c10 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
10c20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
10c30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10c40 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
10c50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
10c60 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
10c70 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10c80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
10c90 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
10ca0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10cb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10cc0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
10cd0 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
10ce0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10cf0 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
10d00 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
10d10 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10d30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
10d40 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
10d50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10d60 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
10d70 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
10d80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10da0 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
10db0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10dc0 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
10dd0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
10de0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
10df0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
10e00 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
10e10 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
10e20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
10e40 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
10e50 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
10e60 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
10e70 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
10e80 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
10e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
10ea0 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
10eb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
10ec0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
10ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10ee0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
10ef0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
10f00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
10f10 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
10f20 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
10f40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10f50 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
10f60 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
10f70 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
10f80 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
10f90 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
10fa0 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
10fb0 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
10fc0 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
10fd0 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
10fe0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
10ff0 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
11000 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
11010 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
11020 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
11030 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
11040 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
11050 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
11060 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
11070 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
11080 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
11090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
110a0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
110b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
110c0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
110d0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
110e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
110f0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
11100 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
11110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
11120 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
11130 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
11140 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11150 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
11160 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
11170 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
11180 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
11190 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
111a0 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
111b0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
111c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
111d0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
111e0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
111f0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
11200 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
11210 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
11220 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
11230 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
11240 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
11250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
11260 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
11270 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
11280 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
11290 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
112a0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
112b0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
112c0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
112d0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
112e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
112f0 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
11300 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
11310 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
11320 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
11330 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
11340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
11350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11360 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
11370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11380 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11390 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
113a0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
113b0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
113c0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
113d0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
113e0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
113f0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
11400 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
11410 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
11420 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
11430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
11440 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
11450 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
11460 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
11470 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
11480 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
11490 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
114a0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
114b0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
114c0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
114d0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
114e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
114f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
11500 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
11510 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
11520 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
11530 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11540 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
11550 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
11560 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
11570 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
11580 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
11590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
115a0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
115b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
115c0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
115d0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
115e0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
115f0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
11600 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
11610 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
11620 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
11630 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
11640 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
11650 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
11660 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
11670 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
11680 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
11690 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
116a0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
116b0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
116c0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
116d0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
116e0 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
116f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11700 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
11710 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
11720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
11730 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
11740 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
11750 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
11760 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
11770 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
11780 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
11790 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
117a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
117b0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
117c0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
117d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
117e0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
117f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
11800 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
11810 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
11820 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
11830 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
11840 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
11850 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
11860 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
11870 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
11880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
118a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
118b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
118c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
118d0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
118e0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
118f0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
11900 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
11910 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
11920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
11930 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
11940 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11950 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
11960 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
11970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11980 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  Off, 1);.      i
11990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
119a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
119b0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
119c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
119d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
119e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
119f0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
11a00 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11a10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11a20 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11a30 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
11a60 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
11a70 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
11a80 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
11a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11aa0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
11ab0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
11ac0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
11ad0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
11ae0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
11af0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
11b00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
11b10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
11b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
11b30 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
11b40 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
11b50 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
11b60 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ');.  }.  if( rc
11b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
11b80 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
11b90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
11ba0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11bb0 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
11bc0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
11bd0 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
11be0 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
11bf0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
11c00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11c10 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
11c20 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
11c30 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
11c40 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
11c50 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
11c60 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
11c70 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
11c80 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
11c90 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
11ca0 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
11cb0 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
11cc0 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
11cd0 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
11ce0 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
11cf0 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
11d00 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
11d10 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
11d20 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
11d30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11d40 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
11d50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
11d60 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
11d70 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
11d80 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
11d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
11da0 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
11db0 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
11dc0 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
11dd0 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
11de0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11df0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
11e00 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
11e10 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
11e20 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
11e30 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
11e40 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
11e50 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
11e60 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
11e70 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
11e80 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
11e90 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
11ea0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
11eb0 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
11ec0 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
11ed0 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
11ee0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
11ef0 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
11f00 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
11f10 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
11f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11f30 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
11f40 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11f50 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f70 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
11f80 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
11f90 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
11fa0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
11fb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11fc0 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
11fd0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11fe0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11ff0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12000 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
12010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12020 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  ;..  /* Set hdrO
12030 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
12040 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74  set just after t
12050 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
12060 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
12070 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66  page written bef
12080 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ore the first jo
12090 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72  urnal-header for
120a0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
120b0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
120c0 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72   was written, or
120d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
120e0 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
120f0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
12100 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
12110 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
12120 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
12130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12140 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
12150 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
12160 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
12170 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
12180 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
12190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
121a0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
121b0 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
121c0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
121d0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
121e0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
121f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12200 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
12210 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ARED );..  /* Fi
12220 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
12230 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
12240 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
12250 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
12260 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
12270 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
12280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
12290 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
122a0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
122b0 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
122c0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
122d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
122e0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
122f0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
12300 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
12310 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
12320 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
12330 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
12340 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
12350 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
12360 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
12370 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
12380 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
12390 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
123a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
123b0 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
123c0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28  i64 offset = i*(
123d0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
123e0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ze);.    rc = pa
123f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
12400 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
12410 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
12420 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  et, 0);.    asse
12430 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
12440 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
12450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
12460 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
12470 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
12480 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
12490 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
124a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
124b0 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
124c0 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
124d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
124e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
124f0 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
12500 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
12510 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
12520 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
12530 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
12540 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
12550 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
12560 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
12570 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
12580 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
12590 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
125a0 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
125b0 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
125c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
125d0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
125e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
125f0 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
12600 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
12610 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
12620 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12630 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
12640 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
12650 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
12660 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
12670 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
12680 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
12690 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
126a0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
126b0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
126c0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
126d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
126e0 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  ff, 1);.    asse
126f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
12700 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
12710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
12720 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
12730 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
12740 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
12750 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
12760 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
12770 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12780 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
12790 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
127a0 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
127b0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
127c0 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
127d0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
127e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
127f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
12800 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
12810 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
12820 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
12830 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
12840 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
12850 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
12860 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
12870 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
12880 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
12890 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
128a0 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
128b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
128c0 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
128d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
128e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
128f0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
12900 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12910 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
12920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
12930 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
12940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12950 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12960 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
12970 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
12980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12990 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
129a0 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
129b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
129c0 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
129d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
129e0 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
129f0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
12a00 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
12a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12a20 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12a30 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
12a40 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
12a50 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
12a60 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
12a70 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
12a80 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
12a90 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
12aa0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
12ab0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
12ac0 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
12ad0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12ae0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
12af0 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
12b00 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
12b10 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
12b20 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
12b30 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
12b40 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
12b50 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
12b60 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
12b70 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
12b80 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
12b90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
12ba0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
12bb0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
12bc0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
12bd0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
12be0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
12bf0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
12c00 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
12c10 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
12c20 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
12c30 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
12c40 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
12c50 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
12c60 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
12c70 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
12c80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
12c90 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
12ca0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
12cb0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
12cc0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
12cd0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
12ce0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
12cf0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
12d00 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
12d10 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
12d20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
12d30 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
12d40 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
12d50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12d60 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
12d70 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
12d80 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
12d90 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
12da0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
12db0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
12dc0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
12dd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
12de0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
12df0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
12e00 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
12e10 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
12e20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
12e30 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12e40 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
12e50 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
12e60 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
12e70 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
12e80 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
12e90 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
12eb0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
12ec0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
12ed0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12ee0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
12ef0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
12f00 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
12f10 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
12f20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
12f30 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12f40 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
12f50 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
12f60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
12f70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
12f80 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
12f90 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
12fa0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
12fb0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
12fc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12fd0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
12fe0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
12ff0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
13000 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13010 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
13020 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
13030 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
13040 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
13050 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
13060 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
13070 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
13080 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
13090 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
130a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
130b0 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
130c0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
130d0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ile;.  pPager->s
130e0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c  ync_flags = (ful
130f0 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  l_fsync?SQLITE_S
13100 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
13110 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
13120 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
13130 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
13140 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
13150 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
13160 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
13170 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
13180 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
13190 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
131a0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
131b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
131c0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
131d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
131e0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
131f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
13200 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
13210 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
13220 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
13230 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
13240 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
13250 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
13260 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
13270 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
13280 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
13290 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
132a0 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
132b0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
132c0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
132d0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
132e0 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
132f0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
13300 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
13310 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
13320 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13330 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
13340 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
13350 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
13360 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
13370 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
13380 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
13390 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
133a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
133b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
133c0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
133d0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
133e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
133f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13400 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
13410 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
13420 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
13430 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
13440 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
13450 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
13460 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
13470 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
13480 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
13490 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
134a0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
134b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
134c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
134d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
134e0 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
134f0 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
13500 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
13510 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
13520 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   || pFile->pMeth
13530 6f 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ods );.  return 
13540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
13550 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
13560 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
13570 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
13580 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
13590 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
135a0 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
135b0 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
135c0 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
135d0 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
135e0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
135f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
13600 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
13610 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
13620 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
13630 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
13640 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
13650 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
13660 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13670 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
13680 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
13690 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
136a0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
136b0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
136c0 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
136d0 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
136e0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
136f0 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
13700 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
13710 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
13720 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
13730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
13740 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
13750 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
13760 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
13770 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
13780 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
13790 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
137a0 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
137b0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
137c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
137d0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
137e0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
137f0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
13800 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
13810 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
13820 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
13830 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
13840 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13850 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
13860 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
13870 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
13880 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
13890 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
138a0 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
138b0 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
138c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
138d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
138e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
138f0 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
13900 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
13910 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
13920 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
13930 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
13940 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
13950 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75  Open() */.){.  u
13960 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
13970 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
13980 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13990 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
139a0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
139b0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
139c0 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
139d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
139e0 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
139f0 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
13a00 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
13a10 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
13a20 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
13a30 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69  EADLOCK)!=0;.  i
13a40 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
13a50 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  ze = sqlite3Jour
13a60 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20  nalSize(pVfs);. 
13a70 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74 20   int szPageDflt 
13a80 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
13a90 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
13aa0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
13ab0 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  0;.  int nPathna
13ac0 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  me = 0;..  /* Th
13ad0 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
13ae0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
13af0 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
13b00 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
13b10 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
13b20 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
13b30 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
13b40 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
13b50 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
13b60 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
13b70 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
13b80 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
13b90 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
13ba0 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
13bb0 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
13bc0 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
13bd0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
13be0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
13bf0 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
13c00 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
13c10 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
13c20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
13c30 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
13c40 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
13c50 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
13c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13c70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
13c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
13c90 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
13ca0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
13cb0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
13cc0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
13cd0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
13ce0 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
13cf0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13d00 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13d10 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
13d20 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
13d30 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
13d40 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13d50 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13d70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
13d80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13d90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13da0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
13db0 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d   strlen(zPathnam
13dc0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  e);.  }..  /* Al
13dd0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
13de0 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  r the pager stru
13df0 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65  cture */.  pPage
13e00 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r = sqlite3Mallo
13e10 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f  cZero(.    sizeo
13e20 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20  f(*pPager) +    
13e30 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
13e40 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
13e50 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
13e60 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
13e70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13e80 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20   structure */ . 
13e90 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c     pVfs->szOsFil
13ea0 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20 2f  e * 3 +        /
13eb0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61 6e  * The main db an
13ec0 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  d two journal fi
13ed0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50  les */ .    3*nP
13ee0 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20  athname + 40    
13ef0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
13f00 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79  name, zDirectory
13f10 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  , zJournal */.  
13f20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
13f30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13f40 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
13f50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13f60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13f70 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
13f80 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
13f90 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
13fa0 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
13fb0 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
13fc0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
13fd0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
13fe0 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
13ff0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
14000 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
14010 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
14020 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
14030 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
14040 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a  s->szOsFile*2];.
14050 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
14060 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
14070 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
14080 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e*2+journalFileS
14090 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
140a0 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
140b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
140c0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
140d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
140e0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
140f0 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
14100 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  +1];.  pPager->p
14110 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66  Vfs = pVfs;.  if
14120 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
14130 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
14140 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
14150 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
14160 65 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e+1);.    sqlite
14170 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
14180 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
14190 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
141a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
141b0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
141c0 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
141d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74   ){.    if( nPat
141e0 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50  hname>(pVfs->mxP
141f0 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66  athname - sizeof
14200 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b  ("-journal")) ){
14210 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14220 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
14230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14240 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
14250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14260 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
14270 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
14280 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20  ager->fd,.      
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c     pPager->vfsFl
142b0 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
142c0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
142d0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
142e0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
142f0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
14300 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14310 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
14320 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
14330 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20        ** choose 
14340 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
14350 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
14360 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
14370 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
14380 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
14390 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
143a0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
143b0 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f:.      **.    
143c0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
143d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
143e0 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ZE,.      **    
143f0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
14400 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
14410 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
14420 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
14430 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
14440 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
14450 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
14460 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14480 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
14490 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
144a0 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  SectorSize = sql
144b0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
144c0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
144d0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
144e0 44 66 6c 74 3c 69 53 65 63 74 6f 72 53 69 7a 65  Dflt<iSectorSize
144f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
14500 50 61 67 65 44 66 6c 74 20 3d 20 69 53 65 63 74  PageDflt = iSect
14510 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
14520 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
14530 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
14540 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
14550 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
14560 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
14570 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
14580 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
14590 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
145a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
145b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
145c0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
145d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
145e0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
145f0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
14600 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
14610 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
14620 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
14630 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
14640 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
14650 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
14660 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
14670 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
14680 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
14690 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
146a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
146b0 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 73 7a  IC|(ii>>8)) ) sz
146c0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
146d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
146e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
146f0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
14700 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  lt>SQLITE_MAX_DE
14710 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
14720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
14730 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
14740 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
14750 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
14760 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14770 20 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d    }else if( !mem
14780 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  Db ){.    /* If 
14790 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
147a0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
147b0 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
147c0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
147d0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
147e0 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
147f0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
14800 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
14810 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
14820 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
14830 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
14840 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
14850 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
14860 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
14870 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14880 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
14890 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20  }..  if( pPager 
148a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
148b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
148c0 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
148d0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a  te3PageMalloc(sz
148e0 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a  PageDflt);.  }..
148f0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
14900 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
14910 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
14920 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
14930 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
14940 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
14950 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
14960 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
14970 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
14980 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
14990 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
149a0 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
149b0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
149c0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
149d0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
149e0 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
149f0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14a00 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
14a10 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
14a20 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
14a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
14a40 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
14a50 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
14a60 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
14a70 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
14a80 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
14a90 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
14aa0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
14ab0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
14ac0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
14ad0 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
14ae0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
14af0 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
14b00 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
14b10 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
14b20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
14b30 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
14b40 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
14b50 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
14b60 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
14b70 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
14b80 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
14b90 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
14ba0 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
14bb0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
14bc0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
14bd0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
14be0 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ame ){.    memcp
14bf0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
14c00 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  al, pPager->zFil
14c10 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
14c20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
14c30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
14c40 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
14c50 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65  urnal", 9);.  }e
14c60 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
14c70 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  >zJournal = 0;. 
14c80 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   }..  /* pPager-
14c90 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
14ca0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75  ; */.  pPager->u
14cb0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a  seJournal = useJ
14cc0 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62  ournal && !memDb
14cd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
14ce0 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c  adlock = noReadl
14cf0 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b  ock && readOnly;
14d00 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14d10 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
14d20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
14d30 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
14d40 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
14d50 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14d60 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62  ->dbSize = memDb
14d70 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61  -1;.  pPager->pa
14d80 67 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44  geSize = szPageD
14d90 66 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  flt;.  /* pPager
14da0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
14db0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14dc0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
14dd0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
14de0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
14df0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
14e00 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  100;.  pPager->m
14e10 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
14e20 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
14e30 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
14e40 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
14e50 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
14e60 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
14e70 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
14e80 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
14e90 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
14ea0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
14eb0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
14ec0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
14ed0 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73   tempFile;.  ass
14ee0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
14ef0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14f00 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
14f10 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
14f20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
14f30 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
14f40 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
14f50 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
14f60 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
14f70 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14f80 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a  de = tempFile; .
14f90 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
14fa0 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
14fb0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
14fc0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
14fd0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
14fe0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
14ff0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
15000 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
15010 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
15020 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
15030 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30  pPager->noSync?0
15040 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  :1);.  pPager->s
15050 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
15060 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
15070 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
15080 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
15090 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
150a0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
150b0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
150c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
150d0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
150e0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
150f0 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ra);.  pPager->j
15100 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
15110 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
15120 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
15130 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50  MIT;.  assert(pP
15140 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15150 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46  ds||memDb||tempF
15160 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d  ile);.  if( !mem
15170 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63  Db ){.    setSec
15180 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
15190 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
151a0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
151b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
151c0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
151d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
151e0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
151f0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
15200 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
15210 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15220 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
15230 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
15240 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49   0;.  pPager->iI
15250 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66  nUseDB = 0;.  if
15260 28 20 21 6d 65 6d 44 62 20 29 7b 0a 23 69 66 6e  ( !memDb ){.#ifn
15270 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
15280 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65  _NOOP.    sqlite
15290 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
152a0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
152b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
152c0 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
152d0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
152e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
152f0 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ex);.    pPager-
15300 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  >pNext = sqlite3
15310 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69  PagerList;.    i
15320 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  f( sqlite3PagerL
15330 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
15340 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
15350 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20  rList->pPrev==0 
15360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15370 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
15380 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d   = pPager;.    }
15390 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72  .    pPager->pPr
153a0 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ev = 0;.    sqli
153b0 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70  te3PagerList = p
153c0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
153d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
153e0 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
153f0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
15400 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
15410 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
15420 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
15430 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15440 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
15450 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15460 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
15470 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
15480 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
15490 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
154a0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
154b0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
154c0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
154d0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
154e0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
154f0 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
15500 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
15510 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
15520 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
15530 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
15540 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
15550 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
15560 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
15570 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
15580 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
15590 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
155a0 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
155b0 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
155c0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
155d0 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
155e0 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
155f0 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
15600 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
15610 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15620 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
15630 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
15640 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
15650 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
15660 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
15670 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
15680 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
15690 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
156a0 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
156b0 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
156c0 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
156d0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
156e0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
156f0 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
15700 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
15710 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
15720 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
15730 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
15740 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
15750 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
15760 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
15770 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
15780 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
15790 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
157a0 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
157b0 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
157c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
157d0 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
157e0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
157f0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
15800 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
15810 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
15820 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
15830 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
15840 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
15850 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
15860 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
15870 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
15880 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
15890 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
158a0 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
158b0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
158c0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
158d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
158e0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
158f0 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
15900 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
15910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15920 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
15930 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
15940 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
15950 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
15960 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
15970 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
15980 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70  SIZE) );.  if( p
15990 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
159a0 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
159b0 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50  eSize .   && !pP
159c0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
159d0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a  Pager->nRef==0 .
159e0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
159f0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
15a00 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
15a10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
15a20 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
15a30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15a40 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
15a50 20 20 20 20 20 20 70 61 67 65 72 45 6e 74 65 72        pagerEnter
15a60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15a70 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
15a80 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
15a90 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
15aa0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 65  geSize;.      se
15ab0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
15ac0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15ad0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
15ae0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
15af0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
15b00 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
15b10 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28       pagerLeave(
15b20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15b30 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20   }.  *pPageSize 
15b40 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15b50 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ze;.  return rc;
15b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15b70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
15b80 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
15b90 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
15ba0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
15bb0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
15bc0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
15bd0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
15be0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
15bf0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
15c00 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
15c10 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
15c20 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
15c30 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
15c40 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
15c50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
15c60 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
15c70 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
15c80 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
15c90 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
15ca0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
15cb0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
15cc0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
15cd0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
15ce0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
15cf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15d00 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
15d10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
15d20 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
15d30 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
15d40 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
15d50 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
15d60 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
15d70 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
15d80 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
15d90 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
15da0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
15db0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
15dc0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
15dd0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
15de0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15df0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
15e00 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
15e10 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
15e20 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
15e30 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
15e40 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
15e50 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
15e60 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
15e70 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
15e80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
15e90 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
15ea0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
15eb0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15ec0 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  er, 0);.  return
15ed0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
15ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
15ef0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
15f00 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
15f10 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
15f20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
15f30 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
15f40 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
15f50 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
15f60 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
15f70 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
15f80 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
15f90 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
15fa0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
15fb0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
15fc0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
15fd0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
15fe0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
15ff0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
16000 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16010 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
16020 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
16030 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
16040 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
16050 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
16060 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
16070 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
16080 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
16090 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
160a0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
160b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
160c0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
160d0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
160e0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
160f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
16100 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
16110 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16120 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
16130 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
16140 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
16150 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
16160 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
16170 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
16180 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
16190 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
161a0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
161b0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
161c0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
161d0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
161e0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
161f0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
16200 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
16210 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
16220 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
16230 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
16240 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
16250 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
16260 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
16270 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
16280 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
16290 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
162a0 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
162b0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
162c0 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
162d0 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
162e0 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
162f0 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
16300 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
16310 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
16320 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
16330 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
16340 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
16350 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
16360 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
16370 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
16380 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
16390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
163a0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
163b0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
163c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
163d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
163e0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
163f0 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d  t(MEMDB||pPager-
16400 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
16410 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16420 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16430 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
16440 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
16450 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
16460 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
16470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16480 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
16490 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
164a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
164b0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
164c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
164d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
164e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
164f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16500 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
16510 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16520 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
16530 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
16540 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
16550 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
16560 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
16570 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
16580 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
16590 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
165a0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
165b0 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
165c0 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
165d0 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
165e0 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
165f0 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
16600 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
16610 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
16620 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
16630 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
16640 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
16650 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
16660 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
16670 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
16680 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
16690 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20  .  i64 n = 0;.  
166a0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
166b0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
166c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
166d0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
166e0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
166f0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
16700 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
16710 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
16720 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
16730 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
16740 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
16750 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
16760 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
16770 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
16780 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
16790 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
167a0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
167b0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
167c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
167d0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
167e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
167f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16800 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
16810 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  -;.      return 
16820 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
16830 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
16840 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
16850 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
16860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
16870 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16880 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
16890 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
168a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
168b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
168c0 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
168d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
168e0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
168f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
16900 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
16910 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78  if( n>pPager->mx
16920 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
16930 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a  er->mxPgno = n;.
16940 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65    }.  if( pnPage
16950 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
16960 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
16970 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16990 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
169a0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
169b0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
169c0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
169d0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
169e0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
169f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 48 69  ite3PageFree(pHi
16a00 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
16a10 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 48  lite3PageFree(pH
16a20 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
16a30 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
16a40 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
16a50 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
16a60 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
16a70 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
16a80 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
16a90 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
16aa0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
16ab0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
16ac0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
16ad0 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
16ae0 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
16af0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
16b00 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
16b10 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
16b20 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
16b30 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
16b40 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
16b50 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
16b60 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16b70 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
16b80 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
16b90 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
16ba0 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
16bb0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
16bc0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
16bd0 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
16be0 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
16bf0 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
16c00 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
16c10 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
16c20 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16c30 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
16c40 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65  ==0 && pPg->pPre
16c50 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
16c60 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
16c70 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
16c80 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
16c90 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
16ca0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
16cb0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
16cc0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
16cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16ce0 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70  er->aHash[pPg->p
16cf0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
16d00 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b  Hash-1)]!=pPg );
16d10 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
16d20 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
16d30 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
16d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16d50 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20  t h = pPg->pgno 
16d60 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
16d70 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  -1);.    pPager-
16d80 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
16d90 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
16da0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
16db0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
16dc0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
16dd0 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d  g, pPager));.  }
16de0 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
16df0 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
16e00 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
16e10 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
16e20 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
16e30 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
16e40 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
16e50 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
16e60 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
16e70 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
16e80 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
16e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
16ea0 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
16eb0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
16ec0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
16ed0 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  ger;..  /* Unlin
16ee0 6b 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65  k from free page
16ef0 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69   list */.  lruLi
16f00 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a  stRemove(pPg);..
16f10 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
16f20 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
16f30 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
16f40 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
16f50 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
16f60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16f70 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
16f80 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
16f90 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
16fa0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
16fb0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
16fc0 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
16fd0 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
16fe0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
16ff0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
17000 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
17010 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
17020 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
17030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
17040 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
17050 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
17060 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
17070 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17080 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
17090 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
170a0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
170b0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
170c0 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
170d0 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
170e0 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
170f0 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
17100 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
17110 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
17120 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
17130 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
17140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
17150 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
17160 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
17170 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
17180 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
17190 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
171a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
171b0 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
171c0 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
171d0 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
171e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
171f0 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
17200 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
17210 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
17220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
17230 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
17240 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17250 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
17260 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17270 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
17280 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
17290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
172a0 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
172b0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f  extAll;.      IO
172c0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
172d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
172e0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
172f0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
17300 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
17310 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
17320 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
17330 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
17340 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
17350 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
17360 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
17370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17380 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
17390 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
173a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
173b0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
173c0 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
173d0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
173e0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
173f0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
17400 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
17410 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
17420 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
17430 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
17440 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
17450 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
17460 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
17470 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
17480 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
17490 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
174a0 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
174b0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
174c0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
174d0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
174e0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
174f0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pe){.  int rc;..
17500 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
17510 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
17520 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
17530 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
17540 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
17550 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
17560 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
17570 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
17580 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
17590 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
175a0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
175b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
175c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
175d0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
175e0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
175f0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
17600 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
17610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17620 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
17630 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
17640 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20  Size<0 || MEMDB 
17650 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
17660 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
17670 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
17680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
17690 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
176a0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 29  ->pBusyHandler )
176b0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
176c0 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20 3d 20 30  ndler->nBusy = 0
176d0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
176e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
176f0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
17700 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
17710 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
17720 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65  E_BUSY && sqlite
17730 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
17740 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
17750 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20  Handler) );.    
17760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17770 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
17780 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
17790 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
177a0 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
177b0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
177c0 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
177d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
177e0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
177f0 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
17800 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17810 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
17820 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
17830 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
17840 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
17850 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
17860 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17870 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
17880 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20  ED || MEMDB );. 
17890 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
178a0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
178b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
178c0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
178d0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
178e0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
178f0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
17900 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
17910 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
17920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17930 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17940 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
17950 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17960 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
17970 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
17980 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
17990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
179a0 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
179b0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
179c0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
179d0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
179e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
179f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17a00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
17a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
17a20 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
17a30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17a40 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
17a50 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
17a60 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
17a70 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
17a80 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
17a90 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
17aa0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
17ab0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
17ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17ae0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
17af0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
17b00 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
17b10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
17b20 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
17b30 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
17b40 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
17b50 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
17b60 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
17b70 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
17b80 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
17b90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17ba0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
17bb0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
17bc0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
17bd0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
17be0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
17bf0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
17c00 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
17c10 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
17c20 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
17c30 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
17c40 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
17c50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
17c60 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
17c70 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
17c80 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
17c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
17ca0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
17cb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
17cc0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
17cd0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
17ce0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
17cf0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
17d00 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
17d10 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
17d20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
17d30 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
17d40 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
17d50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
17d60 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
17d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17d80 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
17d90 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
17da0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
17db0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
17dc0 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
17dd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17de0 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
17df0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
17e00 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
17e10 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
17e20 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
17e30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
17e40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17e50 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  r(mutex);.    if
17e60 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20  ( pPager->pPrev 
17e70 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17e80 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
17e90 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
17ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17eb0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
17ec0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
17ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17ee0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b  pPager->pNext ){
17ef0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17f00 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
17f10 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  ager->pPrev;.   
17f20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
17f30 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
17f40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
17f50 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
17f60 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
17f70 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65    sqlite3FaultBe
17f80 67 69 6e 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20  ginBenign(-1);. 
17f90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17fa0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17fb0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
17fc0 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
17fd0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
17fe0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
17ff0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
18000 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18010 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
18020 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e  lite3FaultEndBen
18030 69 67 6e 28 2d 31 29 3b 0a 20 20 50 41 47 45 52  ign(-1);.  PAGER
18040 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
18050 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18060 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
18070 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
18080 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70  pPager)).  if( p
18090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
180a0 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
180b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
180c0 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
180d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
180e0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
180f0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
18100 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
18110 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
18120 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
18130 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18140 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
18150 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
18160 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
18170 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
18180 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
18190 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
181a0 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
181b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
181c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
181d0 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20  .  ** }.  */..  
181e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
181f0 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73  ger->aHash);.  s
18200 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
18210 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
18220 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18230 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
18240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18250 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
18260 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
18270 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
18280 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18290 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
182a0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
182b0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
182c0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
182d0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
182e0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
182f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18300 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
18310 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
18320 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
18330 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
18340 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
18350 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
18360 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
18370 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
18380 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
18390 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
183a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
183b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
183c0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
183d0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
183e0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
183f0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
18400 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
18410 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
18420 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
18430 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
18440 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
18450 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
18460 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
18470 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
18480 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
18490 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
184a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
184b0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
184c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
184d0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
184e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
184f0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
18500 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
18510 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
18520 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
18530 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
18540 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
18550 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
18560 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
18570 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
18580 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
18590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
185a0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
185b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
185c0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
185d0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
185e0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
185f0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
18600 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
18610 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
18620 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
18630 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
18640 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
18650 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
18660 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
18670 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18680 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
18690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
186a0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
186b0 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
186c0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
186d0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
186e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
186f0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
18700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18710 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
18720 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
18730 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
18740 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
18750 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
18760 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18770 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
18780 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
18790 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
187a0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
187b0 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
187c0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
187d0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
187e0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
187f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
18800 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
18810 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
18820 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
18830 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
18840 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
18850 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
18860 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
18870 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
18880 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
18890 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
188a0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
188b0 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
188c0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
188d0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
188e0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
188f0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
18900 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
18910 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
18920 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
18930 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
18940 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
18950 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
18960 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
18970 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
18980 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
18990 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
189a0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
189b0 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
189c0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
189d0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
189e0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
189f0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
18a00 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18a10 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
18a20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
18a30 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
18a40 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
18a50 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
18a60 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
18a70 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
18a80 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
18a90 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
18aa0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
18ab0 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
18ac0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
18ad0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
18ae0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
18af0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
18b00 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
18b10 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
18b20 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
18b30 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
18b40 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
18b50 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
18b60 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
18b70 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
18b80 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
18b90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
18ba0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18bb0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
18bc0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
18bd0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
18be0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
18bf0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
18c00 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
18c10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18c20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
18c30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18c40 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
18c50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
18c60 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
18c70 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
18c80 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
18c90 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
18ca0 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
18cb0 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
18cc0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
18cd0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
18ce0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
18cf0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  pFile ){.      i
18d00 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
18d10 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
18d20 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
18d30 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
18d40 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
18d50 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20  alOpen );..     
18d60 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
18d70 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
18d80 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
18d90 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
18da0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
18db0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18dc0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
18dd0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
18de0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
18df0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
18e00 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
18e10 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
18e20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
18e30 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
18e40 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
18e50 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
18e60 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
18e70 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
18e80 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
18e90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
18ea0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
18eb0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
18ec0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
18ed0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
18ee0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
18ef0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
18f00 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
18f10 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
18f20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
18f30 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
18f40 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
18f50 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
18f60 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
18f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
18f80 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
18f90 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
18fa0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
18fb0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
18fc0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
18fd0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
18fe0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
18ff0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
19000 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66  lOff;.        if
19010 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
19020 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
19030 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
19040 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
19050 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
19060 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
19070 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19080 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
19090 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
190a0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
190b0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
190c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
190d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
190e0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
190f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19100 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
19110 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
19120 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d         jrnlOff =
19130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19140 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
19150 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
19160 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
19170 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
19180 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f  ", pPager, jrnlO
19190 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  ff, 4));.       
191a0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
191b0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
191c0 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  rnlOff, pPager->
191d0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
191e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
191f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
19200 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
19210 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
19220 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
19230 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
19240 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
19250 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19260 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49  ger));.        I
19270 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
19280 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
19290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
192a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
192b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
192c0 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
192d0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
192e0 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
192f0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
19300 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
19310 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
19320 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
19330 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19340 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
19350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
19360 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
19370 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
19380 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
19390 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
193a0 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
193b0 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
193c0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
193d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
193e0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
193f0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
19400 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
19410 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74  }.    lruListSet
19420 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
19430 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  er);.  }..#ifnde
19440 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
19450 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
19460 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
19470 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
19480 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
19490 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
194a0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
194b0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
194c0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
194d0 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
194e0 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
194f0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
19500 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
19510 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
19520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19530 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
19540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19550 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e  rt( pPager->lru.
19560 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
19570 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
19580 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
19590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
195a0 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
195b0 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63  lists of pages c
195c0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
195d0 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f  ty and in pgno o
195e0 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rder..** Do not 
195f0 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20  both fixing the 
19600 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
19610 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ers..*/.static P
19620 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65  gHdr *merge_page
19630 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20  list(PgHdr *pA, 
19640 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67  PgHdr *pB){.  Pg
19650 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61  Hdr result, *pTa
19660 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72  il;.  pTail = &r
19670 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20  esult;.  while( 
19680 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20  pA && pB ){.    
19690 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d  if( pA->pgno<pB-
196a0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  >pgno ){.      p
196b0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
196c0 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  A;.      pTail =
196d0 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20   pA;.      pA = 
196e0 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pA->pDirty;.    
196f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
19700 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
19710 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
19720 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42  B;.      pB = pB
19730 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
19740 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a    }.  if( pA ){.
19750 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19760 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20  y = pA;.  }else 
19770 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54  if( pB ){.    pT
19780 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
19790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
197a0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30  Tail->pDirty = 0
197b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
197c0 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a  esult.pDirty;.}.
197d0 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20  ./*.** Sort the 
197e0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  list of pages in
197f0 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
19800 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73   by pgno.  Pages
19810 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65   are.** connecte
19820 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e  d by pDirty poin
19830 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76  ters.  The pPrev
19840 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61  Dirty pointers a
19850 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20  re.** corrupted 
19860 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f  by this sort..*/
19870 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
19880 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a  BUCKET_ALLOC 25.
19890 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
198a0 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23  UCKET       25.#
198b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
198c0 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
198d0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
198e0 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65  ket = 0;.  #unde
198f0 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a  f N_SORT_BUCKET.
19900 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54    #define N_SORT
19910 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71  _BUCKET \.   (sq
19920 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19930 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65  rt_bucket?sqlite
19940 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
19950 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43  ucket:N_SORT_BUC
19960 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69  KET_ALLOC).#endi
19970 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  f.static PgHdr *
19980 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
19990 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
199a0 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
199b0 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a  KET_ALLOC], *p;.
199c0 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
199d0 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
199e0 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
199f0 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
19a00 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
19a10 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
19a20 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
19a30 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
19a40 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
19a50 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
19a60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
19a70 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
19a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
19a90 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
19aa0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
19ab0 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
19ac0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
19ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
19ae0 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
19af0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1 ){.      /* Co
19b00 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68  verage: To get h
19b10 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20  ere, there need 
19b20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f  to be 2^(N_SORT_
19b30 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a  BUCKET) .      *
19b40 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
19b50 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68  e input list. Th
19b60 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  is is possible, 
19b70 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e  but impractical.
19b80 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e  .      ** Testin
19b90 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74  g this line is t
19ba0 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62  he point of glob
19bb0 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
19bc0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67    ** sqlite3_pag
19bd0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
19be0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19bf0 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
19c00 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
19c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
19c20 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
19c30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
19c40 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
19c50 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
19c60 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
19c70 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19c80 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
19c90 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
19ca0 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
19cb0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
19cc0 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
19cd0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
19ce0 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
19cf0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
19d00 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
19d10 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
19d20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
19d30 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
19d40 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
19d50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
19d60 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20  PgHdr *p;.  int 
19d70 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
19d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
19d90 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
19da0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
19db0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
19dc0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
19dd0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
19de0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
19df0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
19e00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
19e10 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
19e20 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
19e30 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
19e40 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
19e50 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
19e60 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
19e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
19e80 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
19e90 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
19ea0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
19eb0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
19ec0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
19ed0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
19ee0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
19ef0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
19f00 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
19f10 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
19f20 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
19f30 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
19f40 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
19f50 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
19f60 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
19f70 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
19f80 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
19f90 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
19fa0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
19fb0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
19fc0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
19fd0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
19fe0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
19ff0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1a000 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1a010 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1a020 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1a030 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1a040 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1a050 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1a060 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1a070 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1a080 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1a090 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1a0a0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1a0b0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1a0c0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1a0d0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1a0e0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1a0f0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1a100 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1a110 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1a120 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1a130 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1a140 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1a150 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
1a160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a170 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a180 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
1a190 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
1a1a0 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  t);.  for(p=pLis
1a1b0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1a1c0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1a1d0 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  p->dirty );.    
1a1e0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
1a1f0 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  }.  while( pList
1a200 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
1a210 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
1a220 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
1a230 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
1a240 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1a250 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1a260 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  {.      assert(p
1a270 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1a280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a290 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
1a2a0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
1a2b0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
1a2c0 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  sFlags);.      i
1a2d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a2e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1a2f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1a300 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
1a310 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
1a320 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1a330 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
1a340 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1a350 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
1a360 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
1a370 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
1a380 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
1a390 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
1a3a0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
1a3b0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
1a3c0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
1a3d0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
1a3e0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
1a3f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1a400 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
1a410 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
1a420 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1a430 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
1a440 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1a450 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61  eSize;.      cha
1a460 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
1a470 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  2(pPager, PGHDR_
1a480 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
1a490 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
1a4a0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1a4b0 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E4("STORE %d pag
1a4c0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1a4d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a4e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1a4f0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
1a500 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1a510 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20  ash(pList));.   
1a520 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1a530 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1a540 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1a550 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
1a560 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a570 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1a580 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a590 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
1a5a0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1a5b0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1a5c0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
1a5d0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1a5e0 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
1a5f0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
1a600 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1a610 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1a620 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1a630 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1a640 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1a650 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1a660 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
1a670 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
1a680 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1a690 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
1a6a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a6b0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
1a6c0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gno);.    }.#end
1a6d0 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  if.    if( rc ) 
1a6e0 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65  return rc;.#ifde
1a6f0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1a700 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1a710 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1a720 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1a730 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1a740 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1a750 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
1a760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a770 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
1a780 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
1a790 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
1a7a0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
1a7b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
1a7c0 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
1a7d0 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
1a7e0 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
1a7f0 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
1a800 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
1a810 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
1a820 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1a830 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
1a840 50 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66  Pager){..#ifndef
1a850 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72   NDEBUG.  /* Ver
1a860 69 66 79 20 74 68 65 20 73 61 6e 69 74 79 20 6f  ify the sanity o
1a870 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  f the dirty list
1a880 20 77 68 65 6e 20 77 65 20 61 72 65 20 72 75 6e   when we are run
1a890 6e 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62  ning.  ** in deb
1a8a0 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68  ugging mode.  Th
1a8b0 69 73 20 69 73 20 65 78 70 65 6e 73 69 76 65 2c  is is expensive,
1a8c0 20 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   so do not.  ** 
1a8d0 64 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72  do this on a nor
1a8e0 6d 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20  mal build. */.  
1a8f0 69 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e  int n1 = 0;.  in
1a900 74 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48 64  t n2 = 0;.  PgHd
1a910 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50  r *p;.  for(p=pP
1a920 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
1a930 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69  =p->pNextAll){ i
1a940 66 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e 31  f( p->dirty ) n1
1a950 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50  ++; }.  for(p=pP
1a960 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b  ager->pDirty; p;
1a970 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e   p=p->pDirty){ n
1a980 32 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28  2++; }.  assert(
1a990 20 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69   n1==n2 );.#endi
1a9a0 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  f..  return pPag
1a9b0 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
1a9c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1a9d0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
1a9e0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
1a9f0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
1aa00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
1aa10 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
1aa20 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
1aa30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1aa40 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
1aa50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa60 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
1aa70 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
1aa80 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
1aa90 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
1aaa0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
1aab0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
1aac0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
1aad0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
1aae0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1aaf0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  nal..**.** Retur
1ab00 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e  n negative if un
1ab10 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
1ab20 65 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20  e the status of 
1ab30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1ab40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ab50 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68  does not open th
1ab60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1ab70 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a  o examine its.**
1ab80 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65   content.  Hence
1ab90 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  , the journal mi
1aba0 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ght contain the 
1abb0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1abc0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1abd0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64   that has been d
1abe0 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63  eleted, and henc
1abf0 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f  e not be hot.  O
1ac00 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  r.** the header 
1ac10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  of the journal m
1ac20 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f  ight be zeroed o
1ac30 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
1ac40 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69  e.** does not di
1ac50 73 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73  scover these cas
1ac60 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20  es of a non-hot 
1ac70 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65  journal - if the
1ac80 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1ac90 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
1aca0 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f  ot empty this ro
1acb0 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74  utine assumes it
1acc0 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65  .** is hot.  The
1acd0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1ace0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
1acf0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
1ad00 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1ad10 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
1ad20 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f  ot and will no-o
1ad30 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1ad40 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
1ad50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ad60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1ad70 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1ad80 73 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  s;.  int res = 0
1ad90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1ada0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50  useJournal && pP
1adb0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1adc0 64 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ds ){.    int rc
1add0 3b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  ;.    int exists
1ade0 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  ;.    int locked
1adf0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1ae00 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1ae10 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1ae20 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1ae30 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
1ae40 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  s);.    if( rc==
1ae50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
1ae60 73 74 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  sts ){.      rc 
1ae70 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
1ae80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
1ae90 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
1aea0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1aeb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1aec0 26 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f  && exists && !lo
1aed0 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
1aee0 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  t nPage;.      r
1aef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1af00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1af10 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1af20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1af30 4f 4b 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29  OK && nPage==0 )
1af40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1af50 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1af60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1af70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78  , 0);.        ex
1af80 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  ists = 0;.      
1af90 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 73  }.    }..    res
1afa0 20 3d 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f   = (rc!=SQLITE_O
1afb0 4b 20 3f 20 2d 31 20 3a 20 28 65 78 69 73 74 73  K ? -1 : (exists
1afc0 20 26 26 20 21 6c 6f 63 6b 65 64 29 29 3b 0a 20   && !locked));. 
1afd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73   }..  return res
1afe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
1aff0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1b000 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1b010 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
1b020 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
1b030 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
1b040 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
1b050 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
1b060 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
1b070 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
1b080 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1b090 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1b0a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
1b0b0 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
1b0c0 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1b0d0 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
1b0e0 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
1b0f0 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
1b100 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  al to call this 
1b110 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20  function unless 
1b120 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1b130 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
1b140 20 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61   by pPager has a
1b150 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65  t least one free
1b160 20 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68   page (page with
1b170 20 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20   nRef==0)..  */ 
1b180 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42  .  assert(!MEMDB
1b190 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
1b1a0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1b1b0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
1b1c0 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
1b1d0 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
1b1e0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1b1f0 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
1b200 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
1b210 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
1b220 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
1b230 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1b240 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
1b250 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
1b260 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
1b270 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1b280 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
1b290 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
1b2a0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
1b2b0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1b2c0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
1b2d0 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
1b2e0 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
1b2f0 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
1b300 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
1b310 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
1b320 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
1b330 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
1b340 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  && pPager->lru.p
1b350 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 66 28  First ){.    if(
1b360 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   !pPager->errCod
1b370 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
1b380 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1b390 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b3a0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1b3b0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1b3c0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1b3d0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1b3e0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
1b3f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b400 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   }.      if( pPa
1b410 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1b420 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1b430 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1b440 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1b450 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
1b460 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
1b470 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
1b480 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
1b490 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1b4a0 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
1b4b0 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
1b4c0 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
1b4d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65  al.        ** he
1b4e0 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
1b4f0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
1b500 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
1b510 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 20  hat have.       
1b520 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e   ** already been
1b530 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b540 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73  database (in cas
1b550 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a  e the header is.
1b560 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68          ** trash
1b570 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
1b580 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
1b590 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  d)..        */. 
1b5a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1b5b0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
1b5c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b5d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
1b5e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1b5f0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1b600 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
1b610 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1b620 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1b630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b640 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b660 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b670 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
1b680 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b  ger->lru.pFirst;
1b690 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1b6a0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
1b6b0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1b6c0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
1b6d0 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
1b6e0 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
1b6f0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1b700 26 26 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43  && !pPager->errC
1b710 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
1b720 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1b730 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1b740 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1b750 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1b760 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1b770 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1b780 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1b790 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
1b7a0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
1b7b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1b7c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b7e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1b7f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1b800 74 79 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ty==0 || pPager-
1b810 3e 65 72 72 43 6f 64 65 20 29 3b 0a 0a 20 20 2f  >errCode );..  /
1b820 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
1b830 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
1b840 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
1b850 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
1b860 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c  .  ** set the gl
1b870 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
1b880 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
1b890 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a  isabling the.  *
1b8a0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1b8b0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  ntRollback() opt
1b8c0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
1b8d0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
1b8e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
1b8f0 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
1b900 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61   to do this beca
1b910 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72  use the page mar
1b920 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
1b930 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ck.  ** might be
1b940 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
1b950 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
1b960 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
1b970 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
1b980 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
1b990 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
1b9a0 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
1b9b0 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
1b9c0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61   must.  ** be ma
1b9d0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
1b9e0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
1b9f0 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20   on out..  */.  
1ba00 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
1ba10 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49  ollback ){.    I
1ba20 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f  OTRACE(("ALWAYS_
1ba30 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20  ROLLBACK %p\n", 
1ba40 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61  pPager)).    pPa
1ba50 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1ba60 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
1ba70 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
1ba80 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
1ba90 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
1baa0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
1bab0 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
1bac0 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg);.  assert( p
1bad0 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a  Pg->pgno==0 );..
1bae0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20    *ppPg = pPg;. 
1baf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb00 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1bb10 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
1bb20 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a  Y_MANAGEMENT./*.
1bb30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1bb40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
1bb50 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
1bb60 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1bb70 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
1bb80 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
1bb90 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
1bba0 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
1bbb0 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
1bbc0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
1bbd0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
1bbe0 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65  y be sqlite3_fre
1bbf0 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
1bc00 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
1bc10 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
1bc20 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
1bc30 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
1bc40 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
1bc50 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
1bc60 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75  eturns. The retu
1bc70 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1bc80 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
1bc90 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
1bca0 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
1bcb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1bcc0 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
1bcd0 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20  nt nReq){.  int 
1bce0 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 20 20  nReleased = 0;  
1bcf0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1bd00 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
1bd10 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
1bd20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1bd40 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1bd50 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79  pagers */.  Busy
1bd60 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75  Handler *savedBu
1bd70 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64  sy;     /* Saved
1bd80 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73   copy of the bus
1bd90 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  y handler */.  i
1bda0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bdb0 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65  K;..  /* Acquire
1bdc0 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61   the memory-mana
1bdd0 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a  gement mutex.  *
1bde0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1bdf0 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73 71  _MUTEX_NOOP.  sq
1be00 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
1be10 65 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ex;       /* The
1be20 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20   MEM2 mutex */. 
1be30 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
1be40 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1be50 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1be60 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  EM2);.#endif.  s
1be70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1be80 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  er(mutex);..  /*
1be90 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61   Signal all data
1bea0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1beb0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e   that memory man
1bec0 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20  agement wants.  
1bed0 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  ** to have acces
1bee0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e  s to the pagers.
1bef0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1bf00 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1bf10 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1bf20 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1bf30 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1bf40 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20  >iInUseMM = 1;. 
1bf50 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
1bf60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e  =SQLITE_OK && (n
1bf70 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73  Req<0 || nReleas
1bf80 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20  ed<nReq) ){.    
1bf90 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1bfa0 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64  PgHdr *pRecycled
1bfb0 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74  ;. .    /* Try t
1bfc0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1bfd0 20 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f   recycle that do
1bfe0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1bff0 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20   sync(). If.    
1c000 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  ** this is not p
1c010 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e  ossible, find on
1c020 65 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75  e that does requ
1c030 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20  ire a sync()..  
1c040 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1c050 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
1c060 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1c070 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1c080 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50  IC_LRU));.    pP
1c090 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1c0a0 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
1c0b0 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ced;.    while( 
1c0c0 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65  pPg && (pPg->nee
1c0d0 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50  dSync || pPg->pP
1c0e0 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20  ager->iInUseDB) 
1c0f0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  ){.      pPg = p
1c100 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1c110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1c120 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67  pPg ){.      pPg
1c130 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1c140 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20  eList.pFirst;.  
1c150 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1c160 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  & pPg->pPager->i
1c170 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20  InUseDB ){.     
1c180 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1c190 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ree.pNext;.     
1c1a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1c1b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c1c0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
1c1d0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1c1e0 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20  STATIC_LRU));.. 
1c1f0 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c     /* If pPg==0,
1c200 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20   then the block 
1c210 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64  above has failed
1c220 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1c230 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c  to.    ** recycl
1c240 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1c250 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e  return early - n
1c260 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79  o further memory
1c270 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
1c280 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f  released..    */
1c290 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20  .    if( !pPg ) 
1c2a0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67  break;..    pPag
1c2b0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1c2c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50  ;.    assert(!pP
1c2d0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70  g->needSync || p
1c2e0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  Pg==pPager->lru.
1c2f0 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73  pFirst);.    ass
1c300 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e  ert(pPg->needSyn
1c310 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72  c || pPg==pPager
1c320 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1c330 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65  ed);.  .    save
1c340 64 42 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e  dBusy = pPager->
1c350 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  pBusyHandler;.  
1c360 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
1c370 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20  andler = 0;.    
1c380 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
1c390 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52 65 63  le(pPager, &pRec
1c3a0 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67  ycled);.    pPag
1c3b0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1c3c0 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20   = savedBusy;.  
1c3d0 20 20 61 73 73 65 72 74 28 70 52 65 63 79 63 6c    assert(pRecycl
1c3e0 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53  ed==pPg || rc!=S
1c3f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69  QLITE_OK);.    i
1c400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c410 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27   ){.      /* We'
1c420 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20  ve found a page 
1c430 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73  to free. At this
1c440 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20   point the page 
1c450 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20  has been .      
1c460 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ** removed from 
1c470 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61  the page hash-ta
1c480 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61  ble, free-list a
1c490 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a  nd synced-list .
1c4a0 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74        ** (pFirst
1c4b0 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73  Synced). It is s
1c4c0 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20  till in the all 
1c4d0 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73  pages (pAll) lis
1c4e0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d  t. .      ** Rem
1c4f0 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
1c500 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
1c510 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  eing..      **. 
1c520 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68       ** Todo: Ch
1c530 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53  eck the Pager.pS
1c540 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65  tmt list to make
1c550 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b   sure this is Ok
1c560 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70  . It .      ** p
1c570 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
1c580 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1c590 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20    PgHdr *pTmp;. 
1c5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1c5b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
1c5c0 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  g==pPager->pAll 
1c5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  ){.         pPag
1c5e0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e  er->pAll = pPg->
1c5f0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
1c600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1c610 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d  or( pTmp=pPager-
1c620 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65  >pAll; pTmp->pNe
1c630 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70  xtAll!=pPg; pTmp
1c640 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20  =pTmp->pNextAll 
1c650 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54 6d 70  ){}.        pTmp
1c660 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
1c670 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1c680 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61    }.      nRelea
1c690 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20  sed += (.       
1c6a0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20     sizeof(*pPg) 
1c6b0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1c6c0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73  ze.          + s
1c6d0 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
1c6e0 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
1c6f0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
1c700 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
1c710 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1c720 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
1c730 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61   %p %d *\n", pPa
1c740 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1c750 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c760 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c770 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
1c780 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c790 65 46 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  eFree(pPg->pData
1c7a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c7b0 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
1c7c0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
1c7d0 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  -;.    }else{.  
1c7e0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
1c7f0 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
1c800 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1c810 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a  tabase file or .
1c820 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
1c830 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
1c840 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
1c850 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
1c860 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
1c870 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
1c880 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
1c890 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
1c8a0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
1c8b0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  ..      ** The e
1c8c0 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
1c8d0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
1c8e0 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
1c8f0 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
1c900 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
1c910 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
1c920 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
1c930 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
1c940 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ured..      */. 
1c950 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20       assert(.   
1c960 20 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29         (rc&0xff)
1c970 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
1c980 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  |.          rc==
1c990 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
1c9a0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
1c9b0 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29  ITE_BUSY.      )
1c9c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c9d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c9e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1c9f0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
1ca00 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1ca10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ca20 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79  Clear the memory
1ca30 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67   management flag
1ca40 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  s and release th
1ca50 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66  e mutex.  */.  f
1ca60 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65  or(pPager=sqlite
1ca70 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67  3PagerList; pPag
1ca80 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65  er; pPager=pPage
1ca90 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1caa0 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d  pPager->iInUseMM
1cab0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1cac0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1cad0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  mutex);..  /* Re
1cae0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1caf0 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65  of bytes release
1cb00 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  d.  */.  return 
1cb10 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
1cb20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1cb30 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1cb40 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
1cb50 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1cb60 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
1cb70 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1cb80 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1cb90 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
1cba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1cbb0 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
1cbc0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
1cbd0 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a  ;.  i64 offset;.
1cbe0 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
1cbf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  =0 );.  assert(p
1cc00 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1cc10 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
1cc20 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
1cc30 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1cc40 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
1cc50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
1cc60 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
1cc70 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1cc80 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1cc90 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
1cca0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1ccb0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
1ccc0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1ccd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1cce0 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
1ccf0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1cd00 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1cd10 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1cd20 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1cd30 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1cd40 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1cd50 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
1cd60 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1cd70 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1cd80 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
1cd90 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  u8*)PGHDR_TO_DAT
1cda0 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20  A(pPg))[24],.   
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1cde0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1cdf0 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
1ce00 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
1ce10 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1ce20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
1ce30 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46    PAGERTRACE4("F
1ce40 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1ce50 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1ce70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1ce80 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
1ce90 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
1cea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ceb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cec0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1ced0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
1cee0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
1cef0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
1cf00 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
1cf10 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
1cf20 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
1cf30 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
1cf40 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
1cf50 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1cf60 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
1cf70 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
1cf80 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
1cf90 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1cfa0 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
1cfb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1cfc0 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
1cfd0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
1cfe0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
1cff0 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
1d000 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
1d010 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
1d020 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1d030 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1d040 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d060 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48  TE_OK;.  int isH
1d070 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ot = 0;..  /* If
1d080 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
1d090 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63  s opened for exc
1d0a0 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68  lusive access, h
1d0b0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1d0c0 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66  g .  ** page ref
1d0d0 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69  erences and is i
1d0e0 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  n an error-state
1d0f0 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61  , now is the cha
1d100 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a  nce to clear.  *
1d110 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73  * the error. Dis
1d120 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1d130 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
1d140 61 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61  ache and treat a
1d150 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75  ny.  ** open jou
1d160 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68  rnal file as a h
1d170 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ot-journal..  */
1d180 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
1d190 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1d1a0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
1d1b0 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61  ->nRef==0 && pPa
1d1c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1d1d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d1e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1d1f0 20 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a       isHot = 1;.
1d200 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1d210 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
1d220 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
1d230 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1d240 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1d250 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
1d260 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
1d270 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
1d280 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
1d290 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
1d2a0 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
1d2b0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1d2c0 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
1d2d0 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
1d2e0 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
1d2f0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
1d300 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
1d310 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1d320 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1d330 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1d340 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1d350 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1d360 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
1d370 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d380 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1d390 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20   || isHot ){.   
1d3a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1d3b0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1d3c0 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  s;.    if( !MEMD
1d3d0 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
1d3e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
1d3f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1d400 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
1d410 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
1d420 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1d430 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
1d440 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
1d450 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d470 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d480 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1d490 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  _UNLOCK );.     
1d4a0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
1d4b0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1d4c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
1d4d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d4e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1d4f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1d500 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
1d510 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
1d520 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
1d530 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
1d540 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
1d550 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1d560 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
1d570 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
1d580 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
1d590 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20  r deleted..     
1d5a0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 68   */.      rc = h
1d5b0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
1d5c0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1d5d0 72 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rc<0 ){.        
1d5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1d5f0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
1d600 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1d610 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d620 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20 29  rc==1 || isHot )
1d630 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
1d640 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1d650 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1d660 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
1d670 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
1d680 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
1d690 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
1d6a0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
1d6b0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
1d6c0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
1d6d0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1d6e0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
1d6f0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1d700 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
1d710 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1d720 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
1d730 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
1d740 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
1d750 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
1d760 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
1d770 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
1d780 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
1d790 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
1d7a0 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
1d7b0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1d7c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
1d7d0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
1d7e0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
1d7f0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
1d800 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
1d810 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
1d820 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
1d830 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
1d840 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
1d850 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
1d860 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
1d870 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1d880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d890 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d8a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1d8b0 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
1d8c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
1d8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d8e0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1d8f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1d900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1d930 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
1d940 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1d950 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1d960 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  led;.          }
1d970 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d980 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1d990 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1d9a0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20 20      }. .        
1d9b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
1d9c0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
1d9d0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
1d9e0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
1d9f0 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73         ** exclus
1da00 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1da10 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1da20 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
1da30 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
1da40 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
1da50 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
1da60 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
1da70 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
1da80 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
1da90 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
1daa0 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
1dab0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
1dac0 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
1dad0 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77       ** a read/w
1dae0 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  rite file handle
1daf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1db00 20 20 20 20 20 69 66 28 20 21 69 73 48 6f 74 20       if( !isHot 
1db10 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1db20 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  alOpen==0 ){.   
1db30 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
1db40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1db50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1db60 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
1db70 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
1db80 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
1db90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1dba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1dbc0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
1dbd0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
1dbe0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1dbf0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
1dc00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1dc10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1dc20 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
1dc30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1dc40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1dc50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1dc60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1dc70 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1dc80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1dc90 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
1dca0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
1dcb0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1dcc0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1dcd0 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
1dce0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s );.           
1dcf0 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49     if( fout&SQLI
1dd00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1dd10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dd20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dd30 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1dd40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1dd50 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
1dd60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1dd70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1dd80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dd90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1dda0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
1ddb0 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  xist, that means
1ddc0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
1ddd0 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ess.            
1dde0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1ddf0 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20   rolled it back 
1de00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1de10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1de20 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  Y;.            }
1de30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1de40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1de50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1de60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1de70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc!=SQLITE_NOM
1de80 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  EM && rc!=SQLITE
1de90 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20 0a 20  _IOERR_UNLOCK . 
1dea0 20 20 20 20 20 20 20 20 20 20 26 26 20 72 63 21            && rc!
1deb0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
1dec0 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 20 20 29  MEM .          )
1ded0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1dee0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1def0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1df00 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1df10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
1df20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1df30 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
1df40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1df50 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1df60 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1df70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1df80 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1df90 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1dfa0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1dfb0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1dfc0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
1dfd0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
1dfe0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
1dff0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
1e000 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
1e010 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
1e020 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1e030 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
1e040 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1e050 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1e060 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
1e070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e090 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
1e0a0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1e0b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1e0c0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
1e0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1e0e0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1e0f0 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1e100 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1e110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1e120 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
1e130 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
1e140 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1e150 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  }..      if( pPa
1e160 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1e170 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1e180 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
1e190 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
1e1a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e1b0 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ile.        ** a
1e1c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
1e1d0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
1e1e0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
1e1f0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1e200 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
1e210 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
1e220 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1e230 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1e240 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
1e250 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
1e260 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1e270 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
1e280 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1e290 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ache..        **
1e2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61  .        ** Data
1e2b0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
1e2c0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
1e2d0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
1e2e0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
1e2f0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
1e300 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
1e310 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
1e320 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
1e330 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
1e340 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
1e350 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
1e360 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
1e370 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
1e380 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
1e390 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
1e3a0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
1e3b0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
1e3c0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
1e3d0 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
1e3e0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1e3f0 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
1e400 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
1e410 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
1e420 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
1e430 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65  .        ** dete
1e440 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
1e450 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
1e460 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
1e470 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
1e480 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
1e490 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
1e4a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
1e4b0 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
1e4c0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1e4d0 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
1e4e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1e4f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1e500 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   0);..        if
1e510 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1e520 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
1e530 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1e540 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ode;.          g
1e550 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1e560 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1e570 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1e580 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1e590 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
1e5a0 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
1e5b0 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
1e5c0 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
1e5d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e5e0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1e5f0 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
1e600 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1e610 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
1e620 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e640 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1e650 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e670 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
1e680 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
1e690 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
1e6a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e6b0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
1e6c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e6d0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1e6e0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1e6f0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
1e700 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1e710 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1e720 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e740 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1e750 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
1e760 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te<=PAGER_SHARED
1e770 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1e780 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1e790 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
1e7a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1e7b0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1e7c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65     }.  }.. faile
1e7d0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
1e7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1e7f0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
1e800 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65  is a no-op for e
1e810 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
1e820 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  d in-memory data
1e830 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61  bases. */.    pa
1e840 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
1e850 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
1e860 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
1e870 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20 6f  locate a PgHdr o
1e880 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72 20  bject.   Either 
1e890 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
1e8a0 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20   or reuse.** an 
1e8b0 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61  existing one tha
1e8c0 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  t is not otherwi
1e8d0 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  se in use..**.**
1e8e0 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74 72   A new PgHdr str
1e8f0 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
1e900 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
1e910 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a  following are.**
1e920 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1e930 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f   (1)  We have no
1e940 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d  t exceeded our m
1e950 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64  aximum allocated
1e960 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
1e970 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20 62          as set b
1e980 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63 61  y the "PRAGMA ca
1e990 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e  che_size" comman
1e9a0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  d..**.**     (2)
1e9b0 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75    There are no u
1e9c0 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65  nused PgHdr obje
1e9d0 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74  cts available at
1e9e0 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   this time..**.*
1e9f0 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73 20  *     (3)  This 
1ea00 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1ea10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1ea20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20 61      (4)  There a
1ea30 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65  re no PgHdr obje
1ea40 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  cts that do not 
1ea50 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1ea60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69  l.**          fi
1ea70 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79  le sync and a sy
1ea80 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nc of the journa
1ea90 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  l file is curren
1eaa0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
1eab0 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a  prohibited..**.*
1eac0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75  * Otherwise, reu
1ead0 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50  se an existing P
1eae0 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  gHdr.  In other 
1eaf0 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a  words, reuse an.
1eb00 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  ** existing PgHd
1eb10 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  r if all of the 
1eb20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1eb30 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
1eb40 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63 68  )  We have reach
1eb50 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20 74  ed or exceeded t
1eb60 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65  he maximum cache
1eb70 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20   size.**        
1eb80 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52    allowed by "PR
1eb90 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22  AGMA cache_size"
1eba0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20  ..**.**     (2) 
1ebb0 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48 64   There is a PgHd
1ebc0 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68  r available with
1ebd0 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a   PgHdr->nRef==0.
1ebe0 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57  **.**     (3)  W
1ebf0 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20  e are not in an 
1ec00 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ec10 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  se.**.**     (4)
1ec20 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69    Either there i
1ec30 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50  s an available P
1ec40 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e  gHdr that does n
1ec50 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ot need.**      
1ec60 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64      to be synced
1ec70 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65   to disk or else
1ec80 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73   disk syncing is
1ec90 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
1eca0 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a         allowed..
1ecb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ecc0 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28  gerAllocatePage(
1ecd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1ece0 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
1ecf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ed00 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
1ed10 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48 64 72  ;.  int nByteHdr
1ed20 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ;..  /* Create a
1ed30 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61 6e   new PgHdr if an
1ed40 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f  y of the four co
1ed50 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64  nditions defined
1ed60 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72 65   .  ** above are
1ed70 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70   met: */.  if( p
1ed80 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
1ed90 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c  ger->mxPage.   |
1eda0 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  | pPager->lru.pF
1edb0 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d  irst==0 .   || M
1edc0 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61 67  EMDB.   || (pPag
1edd0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1ede0 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65  nced==0 && pPage
1edf0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20  r->doNotSync).  
1ee00 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  ){.    void *pDa
1ee10 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ta;.    if( pPag
1ee20 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
1ee30 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
1ee40 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
1ee50 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
1ee60 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ,.         pPage
1ee70 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
1ee80 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
1ee90 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  sh*2);.      if(
1eea0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
1eeb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1eec0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1eed0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
1eee0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
1eef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ef00 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
1ef10 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74 65  ager);.    nByte
1ef20 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70 50  Hdr = sizeof(*pP
1ef30 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29  g) + sizeof(u32)
1ef40 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1ef50 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
1ef60 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
1ef70 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 70  gHistory);.    p
1ef80 50 67 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Pg = sqlite3Mall
1ef90 6f 63 28 20 6e 42 79 74 65 48 64 72 20 29 3b 0a  oc( nByteHdr );.
1efa0 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
1efb0 20 20 20 20 20 70 44 61 74 61 20 3d 20 73 71 6c       pData = sql
1efc0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
1efd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1efe0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
1eff0 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
1f000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f010 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  Pg);.        pPg
1f020 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1f030 20 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74    }.    pagerEnt
1f040 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1f050 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1f060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f070 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1f080 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1f090 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1f0a0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e  memset(pPg, 0, n
1f0b0 42 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50  ByteHdr);.    pP
1f0c0 67 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  g->pData = pData
1f0d0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
1f0e0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
1f0f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
1f100 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
1f110 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
1f120 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72   pPg;.    pPager
1f130 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c  ->nPage++;.  }el
1f140 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63  se{.    /* Recyc
1f150 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  le an existing p
1f160 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20  age with a zero 
1f170 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20  ref-count. */.  
1f180 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1f190 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50  ycle(pPager, &pP
1f1a0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1f1b0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
1f1c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f1d0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
1f1e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f1f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f200 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1f210 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1f220 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1f230 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
1f240 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1f250 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20    assert(pPg);. 
1f260 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67   }.  *ppPg = pPg
1f270 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  ;..pager_allocat
1f280 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20  e_out:.  return 
1f290 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
1f2a0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
1f2b0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
1f2c0 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
1f2d0 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
1f2e0 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1f2f0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1f300 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
1f310 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
1f320 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1f330 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
1f340 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
1f350 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
1f360 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
1f370 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
1f380 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
1f390 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
1f3a0 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
1f3b0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
1f3c0 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
1f3d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
1f3e0 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
1f3f0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1f400 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20  ->needRead ){.  
1f410 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44    int rc = readD
1f420 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65  bPage(pPg->pPage
1f430 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e  r, pPg, pPg->pgn
1f440 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
1f450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f460 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
1f470 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1f4c0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
1f4d0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1f4e0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
1f4f0 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
1f500 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
1f510 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
1f520 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
1f530 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
1f540 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
1f550 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
1f560 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
1f570 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
1f580 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1f590 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
1f5a0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
1f5b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1f5c0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
1f5d0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
1f5e0 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
1f5f0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
1f600 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
1f610 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
1f620 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
1f630 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
1f640 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
1f650 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
1f660 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
1f670 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
1f680 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
1f690 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
1f6a0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
1f6b0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
1f6c0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
1f6d0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
1f6e0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
1f6f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
1f700 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f710 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
1f720 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1f730 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f740 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1f750 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
1f760 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
1f770 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
1f780 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1f790 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1f7a0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
1f7b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1f7c0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
1f7d0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
1f7e0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
1f7f0 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
1f800 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
1f810 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
1f820 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
1f830 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
1f840 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
1f850 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
1f860 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
1f870 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
1f880 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
1f890 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
1f8a0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
1f8b0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
1f8c0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
1f8d0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
1f8e0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
1f8f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1f900 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
1f910 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
1f920 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1f930 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
1f940 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
1f950 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
1f960 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
1f970 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
1f980 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
1f990 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
1f9a0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
1f9b0 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
1f9c0 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
1f9d0 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
1f9e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
1f9f0 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
1fa00 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
1fa10 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
1fa20 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
1fa30 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
1fa40 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
1fa50 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
1fa60 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
1fa70 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1fa80 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
1fa90 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
1faa0 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
1fab0 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
1fac0 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
1fad0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
1fae0 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
1faf0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
1fb00 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
1fb10 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
1fb20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb30 70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  pagerAcquire(.  
1fb40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1fb50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1fb60 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1fb70 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1fb80 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1fb90 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1fba0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1fbb0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1fbc0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1fbd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1fbe0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1fbf0 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1fc00 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1fc10 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1fc20 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1fc30 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
1fc40 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
1fc50 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  c;..  assert( pP
1fc60 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1fc70 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61  ER_UNLOCK || pPa
1fc80 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
1fc90 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  gno==1 );..  /* 
1fca0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
1fcb0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
1fcc0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
1fcd0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
1fce0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
1fcf0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
1fd00 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
1fd10 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
1fd20 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
1fd30 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
1fd40 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
1fd50 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1fd60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1fd70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1fd80 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
1fd90 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
1fda0 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
1fdb0 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
1fdc0 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
1fdd0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
1fde0 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ge = 0;..  /* If
1fdf0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1fe00 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
1fe10 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
1fe20 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
1fe30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fe40 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
1fe50 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1fe60 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
1fe70 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
1fe80 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
1fe90 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
1fea0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
1feb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1fed0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1fee0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1fef0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1ff00 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
1ff10 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1ff20 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1ff30 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
1ff40 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1ff50 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
1ff60 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1ff70 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1ff80 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
1ff90 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1ffa0 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
1ffb0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1ffc0 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
1ffd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ffe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fff0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20000 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
20010 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
20020 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
20030 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
20040 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  ize );.    pPg->
20050 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  inJournal = sqli
20060 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
20070 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
20080 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  , pgno);.    pPg
20090 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
200a0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
200b0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
200c0 65 66 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61  ef = 1;..    pPa
200d0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
200e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
200f0 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
20100 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
20110 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
20120 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
20130 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
20140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20150 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
20160 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
20170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20180 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
20190 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
201a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
201b0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
201c0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
201d0 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
201e0 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
201f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20200 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
20210 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
20220 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
20230 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
20240 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
20250 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
20260 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
20270 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
20280 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
20290 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
202a0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
202b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
202c0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
202d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
202e0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
202f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
20300 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
20310 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
20320 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
20330 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
20340 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
20350 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
20360 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
20370 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
20380 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
20390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
203a0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
203b0 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
203c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
203d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
203e0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
203f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
20400 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
20410 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
20420 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20430 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
20440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20450 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
20460 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
20470 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
20480 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
20490 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
204a0 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
204b0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
204c0 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
204d0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
204e0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
204f0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
20500 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
20510 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
20520 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
20530 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
20540 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
20550 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
20560 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
20570 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
20580 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
20590 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
205a0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
205b0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
205c0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
205d0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
205e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
205f0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
20600 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
20610 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
20620 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
20630 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
20640 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
20650 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
20660 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
20670 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
20680 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
20690 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
206a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
206b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
206c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
206d0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
206e0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
206f0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
20700 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
20710 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
20720 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
20730 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
20740 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
20750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20760 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
20770 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
20780 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
20790 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
207a0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
207b0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
207c0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
207d0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
207e0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
207f0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
20800 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
20810 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
20820 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
20830 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20840 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
20850 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
20860 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
20870 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  nt);.  pagerLeav
20880 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
20890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
208a0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
208b0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
208c0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
208d0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
208e0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
208f0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
20900 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20910 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
20920 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
20930 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20940 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
20950 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20960 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
20970 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
20980 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
20990 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
209a0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
209b0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
209c0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
209d0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
209e0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
209f0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
20a00 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
20a10 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
20a20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20a30 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
20a40 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
20a50 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
20a60 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
20a70 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
20a80 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
20a90 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
20aa0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
20ab0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
20ac0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
20ad0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
20ae0 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
20af0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
20b00 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
20b10 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
20b20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20b30 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65  r->pAll || pPage
20b40 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20b50 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
20b60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20b70 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20b80 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20b90 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
20ba0 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  hing */.  }else 
20bb0 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72  if( (pPg = pager
20bc0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
20bd0 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  pgno))!=0 ){.   
20be0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
20bf0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
20c00 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
20c10 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
20c20 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
20c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
20c40 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20c50 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
20c60 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
20c70 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
20c80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
20c90 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
20ca0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
20cb0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
20cc0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
20cd0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
20ce0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
20cf0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
20d00 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
20d10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20d20 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
20d30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
20d40 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ..  if( pPg==0 )
20d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20d60 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50  K;.  pPager = pP
20d70 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
20d80 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
20d90 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
20da0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
20db0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
20dc0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
20dd0 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
20de0 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
20df0 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  f--;..  CHECK_PA
20e00 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
20e10 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
20e20 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20e30 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
20e40 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
20e50 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
20e60 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
20e70 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
20e80 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
20e90 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69  =0 ){..    lruLi
20ea0 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20  stAdd(pPg);.    
20eb0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
20ec0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
20ed0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
20ee0 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
20ef0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20f00 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
20f10 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
20f20 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
20f30 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
20f40 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
20f50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20f60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
20f70 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
20f80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20f90 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
20fa0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
20fb0 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
20fc0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
20fd0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20fe0 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
20ff0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
21000 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
21010 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
21020 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
21030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21040 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
21050 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
21060 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
21070 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
21080 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
21090 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
210a0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
210b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
210c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
210d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
210e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
210f0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
21100 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
21110 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
21120 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
21130 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
21140 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
21150 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21160 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
21170 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21180 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
21190 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
211a0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
211b0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
211c0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
211d0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
211e0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
211f0 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
21200 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
21210 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21220 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21230 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
21240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
21250 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
21260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
21270 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
21280 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21290 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
212a0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
212b0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
212c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
212d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
212e0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
212f0 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  ze);.  pagerEnte
21300 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
21310 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21320 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
21330 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21340 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
21350 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
21360 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
21370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
21380 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
21390 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
213a0 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
213b0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
213c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
213d0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
213e0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73  URNAL);.    }els
213f0 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  e{.      flags |
21400 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
21410 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
21420 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21430 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
21440 57 52 49 54 45 0a 20 20 20 20 72 63 20 3d 20 73  WRITE.    rc = s
21450 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
21460 6e 28 0a 20 20 20 20 20 20 20 20 70 56 66 73 2c  n(.        pVfs,
21470 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
21480 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
21490 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
214a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
214b0 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72    );.#else.    r
214c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
214d0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
214e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
214f0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
21500 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
21510 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21520 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
21530 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
21540 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21550 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
21560 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
21570 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21580 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
21590 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
215a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
215b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
215c0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
215d0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
215e0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
215f0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
21600 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
21610 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
21620 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  ournal;.    }.  
21630 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
21640 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
21650 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
21660 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
21670 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
21680 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
21690 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
216a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
216b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
216c0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
216d0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
216e0 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
216f0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
21700 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
21710 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21720 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21730 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
21740 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
21750 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
21760 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
21770 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
21780 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
21790 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
217a0 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
217b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
217c0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
217d0 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d  TE_NOMEM && rc!=
217e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
217f0 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
21800 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
21810 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
21820 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21840 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
21850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21860 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
21870 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
21880 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  :.  sqlite3Bitve
21890 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
218a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
218b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
218c0 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
218d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
218e0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
218f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21900 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
21910 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
21920 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
21930 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
21940 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
21950 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
21960 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
21970 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
21980 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
21990 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
219a0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
219b0 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
219c0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
219d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
219e0 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
219f0 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
21a00 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
21a10 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
21a20 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
21a30 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
21a40 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
21a50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
21a60 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
21a70 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
21a80 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
21a90 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
21aa0 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
21ab0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
21ac0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
21ad0 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
21ae0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
21af0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
21b00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
21b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
21b20 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
21b30 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
21b40 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
21b50 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
21b60 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
21b70 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
21b80 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
21b90 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
21ba0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
21bb0 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
21bc0 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
21bd0 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
21be0 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
21bf0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
21c00 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
21c10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21c20 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
21c30 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
21c40 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
21c50 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21c60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21c70 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21c80 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
21c90 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
21ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21cb0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
21cc0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
21cd0 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
21ce0 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
21cf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
21d00 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
21d10 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
21d20 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
21d30 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
21d40 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
21d50 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
21d60 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
21d70 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
21d80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21d90 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
21da0 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
21db0 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
21dc0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21dd0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
21de0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
21df0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21e00 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21e10 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
21e20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21e30 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
21e40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
21e50 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
21e60 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
21e70 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21e80 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
21e90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21ea0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
21eb0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
21ec0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
21ed0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21ee0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
21f10 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21f20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
21f30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21f40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21f50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
21f60 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
21f70 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
21f80 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
21f90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
21fa0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
21fb0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
21fc0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
21fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21ff0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65  .        pagerLe
22000 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
22010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
22030 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
22040 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
22050 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
22060 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
22070 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
22080 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22090 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
220a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
220c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
220d0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
220e0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
220f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22100 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
22110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22120 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
22130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22140 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
22150 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
22160 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
22170 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
22180 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
22190 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
221a0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
221b0 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
221c0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
221d0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
221e0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
221f0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
22200 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
22210 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
22220 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
22230 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
22240 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
22250 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
22260 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
22270 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
22280 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
22290 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
222a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
222b0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
222c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
222d0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
222e0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
222f0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
22300 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
22310 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
22320 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
22330 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
22340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
22350 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
22360 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
22370 63 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d  cCreate( pPager-
22380 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  >dbSize );.    p
22390 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
223a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
223b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
223c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
223d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
223e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
223f0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
22400 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
22410 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
22420 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
22430 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
22440 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
22450 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
22460 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22470 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
22480 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65  ITE_OK );.  page
22490 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
224a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
224b0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
224c0 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74  e dirty.  Set it
224d0 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64  s dirty flag and
224e0 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64   add it to the d
224f0 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73  irty.** page lis
22500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
22510 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64  d makeDirty(PgHd
22520 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
22530 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a  Pg->dirty==0 ){.
22540 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
22550 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22560 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
22570 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
22580 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
22590 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70  Dirty;.    if( p
225a0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b  Pager->pDirty ){
225b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
225c0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
225d0 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  y = pPg;.    }. 
225e0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
225f0 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
22600 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
22610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
22620 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e  ake a page clean
22630 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72  .  Clear its dir
22640 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76  ty bit and remov
22650 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  e it from the.**
22660 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74   dirty page list
22670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22680 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
22690 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
226a0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
226b0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
226c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69      if( pPg->pDi
226d0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
226e0 65 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79  ert( pPg->pDirty
226f0 2d 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50  ->pPrevDirty==pP
22700 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
22710 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
22720 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
22730 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
22740 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
22750 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
22760 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44  ert( pPg->pPrevD
22770 69 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50  irty->pDirty==pP
22780 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
22790 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
227a0 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
227b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
227c0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
227d0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d  pPager->pDirty==
227e0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
227f0 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
22800 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
22810 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
22820 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
22830 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
22840 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
22850 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
22860 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
22870 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
22880 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
22890 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
228a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
228b0 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
228c0 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
228d0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
228e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
228f0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
22900 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
22910 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
22920 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
22930 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
22940 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
22950 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
22960 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
22970 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
22980 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
22990 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
229a0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
229b0 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
229c0 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
229d0 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
229e0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
229f0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
22a00 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
22a10 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
22a20 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
22a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22a40 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
22a50 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
22a60 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
22a70 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
22a80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
22a90 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
22aa0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
22ab0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
22ac0 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
22ad0 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
22ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
22af0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
22b00 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
22b10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
22b20 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
22b30 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
22b40 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
22b50 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
22b60 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
22b70 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
22b80 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
22b90 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg);.  Pager *pP
22ba0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
22bb0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
22bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
22bd0 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
22be0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
22bf0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
22c00 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
22c10 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
22c20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
22c30 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
22c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
22c50 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
22c60 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
22c70 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
22c80 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
22c90 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
22ca0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
22cb0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
22cc0 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
22cd0 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
22ce0 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
22cf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
22d00 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
22d10 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
22d20 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
22d30 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
22d40 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
22d50 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
22d60 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
22d70 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
22d80 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
22d90 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
22da0 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
22db0 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
22dc0 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
22dd0 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
22de0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
22df0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
22e00 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
22e10 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
22e20 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
22e30 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
22e40 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
22e50 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
22e60 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22e70 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
22e80 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
22e90 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
22ea0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
22eb0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
22ec0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
22ed0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
22ee0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
22ef0 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
22f00 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
22f10 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
22f20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
22f30 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
22f40 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
22f50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
22f60 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
22f70 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
22f80 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
22f90 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
22fa0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
22fb0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
22fc0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
22fd0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
22fe0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
22ff0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
23000 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
23010 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
23020 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
23030 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
23040 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
23050 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
23060 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
23070 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
23080 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
23090 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
230a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
230b0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
230c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
230d0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
230e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
230f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23110 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23120 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
23130 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
23140 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
23150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
23160 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
23170 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
23180 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
23190 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
231a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
231b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
231c0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
231d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
231e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
231f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
23200 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
23210 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
23220 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
23230 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
23240 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
23250 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
23260 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
23270 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
23280 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
23290 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
232a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
232b0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
232c0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
232d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
232e0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
232f0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
23300 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
23310 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
23320 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
23330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
23340 65 6e 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  en || MEMDB) ){.
23350 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
23360 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
23370 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23380 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  {.        if( ME
23390 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
233a0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
233b0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
233c0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
233d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
233e0 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
233f0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
23400 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
23410 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
23420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
23430 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
23440 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
23450 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33  >pOrig = sqlite3
23460 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  PageMalloc( pPag
23470 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
23480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
23490 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
234a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
234b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
234c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
234d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
234e0 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
234f0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
23500 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
23510 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23520 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
23530 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  ksum;.          
23540 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
23550 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
23560 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
23570 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
23580 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
23590 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
235a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
235b0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
235c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
235d0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
235e0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
235f0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
23600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23610 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
23620 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
23630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
23640 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
23650 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
23660 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
23670 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
23680 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
23690 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
236a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
236b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
236c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
236d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
236e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
236f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23720 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
23730 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
23740 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
23770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
23780 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
23790 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
237a0 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
237b0 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
237c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
237d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
237e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
237f0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
23800 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
23810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23820 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
23830 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
23840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
23850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23860 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
23870 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
23880 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
23890 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
238c0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
238d0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
238e0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
238f0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
23900 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
23910 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
23920 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
23930 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
23940 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
23960 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
23970 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
23980 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
23990 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a  agehash(pPg));..
239a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
239b0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
239c0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
239d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
239e0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
239f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
23a00 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
23a10 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
23a20 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
23a30 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
23a40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
23a60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
23a70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
23a80 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
23a90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23aa0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
23ab0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
23ac0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
23ad0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
23ae0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
23af0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  no);.          p
23b00 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
23b10 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
23b20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
23b30 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
23b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
23b50 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
23b60 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
23b70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23b90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
23ba0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
23bb0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
23bc0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
23bd0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
23be0 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
23bf0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
23c00 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
23c10 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
23c20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
23c30 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23c40 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
23c50 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
23c60 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
23c70 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
23c80 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
23c90 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
23ca0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
23cb0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
23cc0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
23cd0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
23ce0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
23cf0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
23d00 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
23d10 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
23d20 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
23d30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23d40 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
23d50 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
23d60 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
23d70 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
23d80 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
23d90 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
23da0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
23db0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
23dc0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
23dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23de0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23df0 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
23e00 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
23e10 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
23e20 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
23e30 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
23e40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23e50 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
23e60 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
23e70 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
23e80 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
23e90 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
23ea0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
23eb0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
23ec0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
23ed0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
23ee0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
23ef0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
23f00 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
23f10 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
23f20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
23f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23f40 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
23f50 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
23f60 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
23f70 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
23f80 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23f90 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
23fa0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23fb0 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
23fc0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
23fd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23fe0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23ff0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
24000 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
24010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24020 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
24030 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
24040 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
24050 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24060 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
24070 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
24080 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
24090 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 7);.        rc
240a0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
240b0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
240c0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
240d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
240e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
240f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24100 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
24110 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
24120 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
24130 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
24140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24150 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
24160 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
24170 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
24180 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
24190 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
241a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
241b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
241c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
241d0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
241e0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
241f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24200 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d  Pager->pInStmt!=
24210 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
24220 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
24230 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
24240 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
24250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24260 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
24270 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
24280 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
24290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
242a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
242b0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
242c0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
242d0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
242e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
242f0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
24300 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
24310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
24320 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
24330 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
24340 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
24350 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
24360 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24370 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24380 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24390 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
243a0 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
243b0 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
243c0 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
243d0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
243e0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
243f0 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
24400 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
24410 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
24420 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
24430 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
24440 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
24450 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
24460 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
24470 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
24480 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
24490 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
244a0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
244b0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
244c0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
244d0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
244e0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
244f0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
24500 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
24510 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
24520 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
24530 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
24540 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24550 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
24560 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
24570 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
24580 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
24590 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
245a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
245b0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
245c0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
245d0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
245e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
245f0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
24600 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d  Pager);.  if( !M
24610 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
24620 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
24630 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
24640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
24650 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
24660 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
24670 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
24680 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
24690 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
246a0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
246b0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
246c0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
246d0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
246e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
246f0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
24700 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
24710 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
24720 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
24730 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
24740 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
24750 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
24760 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
24770 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
24780 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
24790 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
247a0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
247b0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
247c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
247d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
247e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
247f0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
24800 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
24810 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
24820 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
24830 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
24840 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
24850 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
24860 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
24870 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
24880 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
24890 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
248a0 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
248b0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
248c0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
248d0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
248e0 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
248f0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
24900 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
24910 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
24920 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24930 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
24940 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
24950 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
24960 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
24970 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
24980 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
24990 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
249a0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
249b0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
249c0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
249d0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
249e0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
249f0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
24a00 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
24a10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24a20 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
24a30 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
24a40 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
24a50 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
24a60 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
24a70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
24a80 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
24a90 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
24aa0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
24ab0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
24ac0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
24ad0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
24ae0 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
24af0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
24b00 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
24b10 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
24b20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
24b30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
24b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24b50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24b60 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
24b70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
24b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
24ba0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
24bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24bc0 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
24bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24be0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24c00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24c10 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
24c20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
24c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c40 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
24c50 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
24c60 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
24c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24c80 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29  Page->needSync )
24c90 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
24ca0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
24cb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24cc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
24cd0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
24ce0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
24cf0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
24d00 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
24d10 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
24d20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
24d30 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
24d40 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
24d50 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
24d60 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
24d70 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
24d80 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
24d90 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
24da0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
24db0 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
24dc0 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
24dd0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
24de0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
24df0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
24e00 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
24e10 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
24e20 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
24e30 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  c ){.      for(i
24e40 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
24e50 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29   needSync; ii++)
24e60 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
24e70 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
24e80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
24e90 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
24ea0 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65  f( pPage ) pPage
24eb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
24ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24ed0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
24ee0 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
24ef0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24f00 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
24f10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
24f20 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
24f30 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
24f40 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
24f50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  age);.  }.  page
24f60 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
24f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24f80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
24f90 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
24fa0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
24fb0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
24fc0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
24fd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24fe0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
24ff0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
25000 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
25010 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
25020 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
25030 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
25040 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
25050 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
25060 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
25070 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
25080 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  rty;.}.#endif../
25090 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
250a0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
250b0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
250c0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
250d0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
250e0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
250f0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
25100 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
25110 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
25120 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
25130 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
25140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
25150 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
25160 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
25170 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
25180 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
25190 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
251a0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
251b0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
251c0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
251d0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
251e0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
251f0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
25200 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
25210 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
25220 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
25230 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
25240 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
25250 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
25260 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
25270 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
25280 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
25290 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
252a0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
252b0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
252c0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
252d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
252e0 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
252f0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
25300 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
25310 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
25320 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25330 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
25340 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
25350 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
25360 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
25370 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
25380 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
25390 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
253a0 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
253b0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
253c0 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
253d0 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
253e0 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
253f0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
25400 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
25410 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
25420 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
25430 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
25440 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
25450 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
25460 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
25470 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
25480 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
25490 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
254a0 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
254b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
254c0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
254d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
254e0 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
254f0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
25500 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
25510 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
25520 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
25530 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
25540 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
25550 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
25560 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
25570 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25580 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
25590 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
255a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
255b0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
255c0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
255d0 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
255e0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
255f0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
25600 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
25610 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
25620 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
25630 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
25640 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
25650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25660 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
25670 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
25680 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
25690 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
256a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
256b0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
256c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
256d0 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
256e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
256f0 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
25700 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
25710 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
25720 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
25730 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
25740 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
25750 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
25760 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
25770 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
25780 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
25790 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
257a0 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
257b0 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
257c0 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
257d0 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
257e0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
257f0 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
25800 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
25810 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
25820 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
25830 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
25840 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
25850 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
25860 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
25870 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
25880 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
25890 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
258a0 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
258b0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
258c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
258d0 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
258e0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
258f0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
25900 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
25910 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
25920 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
25930 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
25940 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
25950 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
25960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
25970 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
25980 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
25990 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
259a0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
259b0 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
259c0 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
259d0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
259e0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
259f0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
25a00 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
25a10 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
25a20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
25a30 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
25a40 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
25a50 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
25a60 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
25a70 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
25a80 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
25a90 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
25aa0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
25ab0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
25ac0 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
25ad0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
25ae0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
25af0 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
25b00 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
25b10 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
25b20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
25b30 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
25b40 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
25b50 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
25b60 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
25b70 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
25b80 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
25b90 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
25ba0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
25bb0 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
25bc0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
25bd0 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
25be0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
25bf0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
25c00 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72  pPager;..  pager
25c10 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
25c20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25c30 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
25c40 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
25c50 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
25c60 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
25c70 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20   or DontWrite() 
25c80 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
25c90 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67  on.  ** this pag
25ca0 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73  e (DontWrite() s
25cb0 65 74 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f  ets the alwaysRo
25cc0 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68  llback flag), th
25cd0 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  en this.  ** fun
25ce0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25cf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
25d10 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61  ==0 || pPg->alwa
25d20 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
25d30 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
25d40 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 61 67 65  back ){.    page
25d50 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
25d60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25d70 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
25d80 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20   );    /* For a 
25d90 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a  memdb, pPager->j
25da0 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c  ournalOpen is al
25db0 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65  ways 0 */..#ifde
25dc0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
25dd0 44 45 4c 45 54 45 0a 20 20 69 66 28 20 70 50 67  DELETE.  if( pPg
25de0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
25df0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20  int)pPg->pgno > 
25e00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25e10 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
25e20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25e30 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c  /* If SECURE_DEL
25e40 45 54 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ETE is disabled,
25e50 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
25e60 6f 20 77 61 79 20 74 68 61 74 20 74 68 69 73 0a  o way that this.
25e70 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e    ** routine can
25e80 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
25e90 70 61 67 65 20 66 6f 72 20 77 68 69 63 68 20 73  page for which s
25ea0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
25eb0 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20  rite().  ** has 
25ec0 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
25ed0 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  sly called durin
25ee0 67 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  g the same trans
25ef0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64  action..  ** And
25f00 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20   if DontWrite() 
25f10 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62  has previously b
25f20 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25f30 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
25f40 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
25f50 65 20 6d 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e met..  */.  as
25f60 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f  sert( !pPg->inJo
25f70 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
25f80 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
25f90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
25fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25fb0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
25fc0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  0 );.  sqlite3Bi
25fd0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
25fe0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
25ff0 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69  >pgno);.  pPg->i
26000 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
26010 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
26020 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
26030 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
26040 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26050 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50  ->stmtSize >= pP
26060 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
26070 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
26080 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
26090 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70  >pInStmt, pPg->p
260a0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45  gno);.  }.  PAGE
260b0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
260c0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
260d0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
260e0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
260f0 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
26100 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
26110 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
26120 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c  >pgno)).  pagerL
26130 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
26140 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
26150 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
26160 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
26170 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
26180 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
26190 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
261a0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
261b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
261c0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
261d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
261e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
261f0 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
26200 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
26210 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
26220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26230 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
26240 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26250 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f  untDone ){.    /
26260 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
26270 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
26280 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
26290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
262a0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
262b0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
262c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
262d0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
262e0 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b  if( !isDirect ){
262f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26300 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26310 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  gHdr);.      if(
26320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26340 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
26350 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  dr);.        ret
26360 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26370 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
26380 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
26390 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
263a0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
263b0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
263c0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
263d0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
263e0 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
263f0 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
26400 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
26410 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
26420 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  ((char*)PGHDR_TO
26430 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32  _DATA(pPgHdr))+2
26440 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
26450 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44  r);..    if( isD
26460 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d  irect && pPager-
26470 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
26480 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  .      const voi
26490 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f  d *zBuf = PGHDR_
264a0 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b  TO_DATA(pPgHdr);
264b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
264c0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
264d0 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
264e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
264f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
26500 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
26510 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
26520 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26530 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
26540 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
26550 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
26560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
26580 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
26590 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
265a0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
265b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
265c0 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
265d0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
265e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
265f0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
26600 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
26610 67 73 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  gs);.  pagerLeav
26620 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
26630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26640 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
26650 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
26660 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
26670 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
26680 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
26690 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
266a0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
266b0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
266c0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
266d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
266e0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
266f0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
26700 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
26710 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
26720 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
26730 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
26740 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
26750 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
26760 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
26770 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
26780 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
26790 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
267a0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
267b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
267c0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
267d0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
267e0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
267f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
26800 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
26810 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26820 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
26830 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
26840 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
26850 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
26860 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
26870 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
26880 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
26890 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
268a0 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
268b0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
268c0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
268d0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
268e0 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
268f0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
26900 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
26910 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
26920 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
26930 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
26940 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a  databases)..**.*
26950 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
26960 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
26970 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
26980 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26990 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
269a0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
269b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
269c0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
269d0 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
269e0 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
269f0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
26a00 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
26a10 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
26a20 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
26a30 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
26a40 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
26a50 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
26a60 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
26a70 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f  r *pPager, .  co
26a80 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
26a90 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e  r, .  Pgno nTrun
26aa0 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a  c,.  int noSync.
26ab0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26ac0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
26ad0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26ae0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
26af0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
26b00 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63   }..  /* If no c
26b10 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
26b20 20 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65   made, we can le
26b30 61 76 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ave the transact
26b40 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a  ion early..  */.
26b50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
26b60 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20  Modified==0 &&. 
26b70 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
26b80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
26b90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
26ba0 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20  ELETE ||.       
26bb0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
26bc0 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a  siveMode!=0) ){.
26bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26be0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
26bf0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 || pPager->jou
26c00 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
26c10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26c20 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
26c30 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53  RTRACE4("DATABAS
26c40 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
26c50 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
26c60 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
26c70 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
26c80 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
26c90 6e 63 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  nc);.  pagerEnte
26ca0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  r(pPager);..  /*
26cb0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
26cc0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
26cd0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
26ce0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
26cf0 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
26d00 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
26d10 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
26d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
26d30 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
26d40 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
26d50 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
26d60 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
26d70 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
26d80 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53   *pPg;..#ifdef S
26d90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
26da0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a  MIC_WRITE.    /*
26db0 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   The atomic-writ
26dc0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
26dd0 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  an be used if al
26de0 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  l of the.    ** 
26df0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
26e00 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ue:.    **.    *
26e10 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d  *    + The file-
26e20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
26e30 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
26e40 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
26e50 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
26e60 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
26e70 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  ze, and.    **  
26e80 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    + This commit 
26e90 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
26ea0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
26eb0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
26ec0 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79   **    + Exactly
26ed0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
26ee0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
26ef0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
26f00 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
26f10 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
26f20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
26f30 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74   be used, then t
26f40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26f50 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a  will never.    *
26f60 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72  * be created for
26f70 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
26f80 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  n..    */.    in
26f90 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  t useAtomicWrite
26fa0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d   = (.        !zM
26fb0 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20  aster && .      
26fc0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
26fd0 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20  lOpen &&.       
26fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26ff0 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
27000 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
27010 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d          nTrunc==
27020 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 30  0 && .        (0
27030 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ==pPager->pDirty
27040 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70   || 0==pPager->p
27050 44 69 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20  Dirty->pDirty). 
27060 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
27070 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
27080 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
27090 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
270a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
270b0 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75  OFF );.    if( u
270c0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b  seAtomicWrite ){
270d0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
270e0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
270f0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
27100 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ile. */.      in
27110 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  t offset = pPage
27120 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
27130 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
27140 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73  agic);.      ass
27150 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63  ert(pPager->nRec
27160 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ==1);.      rc =
27170 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
27180 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74  ger->jfd, offset
27190 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
271a0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
271b0 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
271c0 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68  ange counter. Th
271d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
271e0 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20   will modify.   
271f0 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d     ** the in-mem
27200 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
27210 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  on of page 1 to 
27220 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
27230 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  ted.      ** cha
27240 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
27250 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
27260 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  1 directly to th
27270 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
27280 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73   ** file. Becaus
27290 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
272a0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f  write property o
272b0 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
272c0 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a  system, .      *
272d0 2a 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  * this is safe..
272e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
272f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27310 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
27320 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
27330 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
27340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27350 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
27360 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
27370 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
27380 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63    if( !useAtomic
27390 57 72 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c  Write && rc==SQL
273a0 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a  ITE_OK ).#endif.
273b0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
273c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
273d0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
273e0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
273f0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
27400 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
27410 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
27420 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
27430 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
27440 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
27450 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
27460 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
27470 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
27480 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
27490 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
274a0 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
274b0 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
274c0 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
274d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
274e0 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
274f0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
27500 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
27510 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27520 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
27530 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27540 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
27550 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
27560 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27570 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
27580 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69  nc_exit;.      i
27590 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
275a0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
275b0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
275c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
275d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
275e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 72 75          if( nTru
275f0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
27600 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
27610 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
27620 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
27630 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
27640 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
27650 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
27660 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
27670 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
27680 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
27690 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
276a0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
276b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
276c0 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
276d0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
276e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
276f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  er);.          f
27700 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
27710 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
27720 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
27730 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
27740 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
27750 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
27760 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
27770 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
27780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27790 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
277a0 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
277b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
277c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
277d0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
277e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
277f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27800 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
27810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
27820 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27850 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
27860 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27870 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20           } .    
27880 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27890 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
278a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
278b0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
278c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
278d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
278e0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
278f0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
27900 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
27910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27930 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27940 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
27950 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27960 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
27970 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
27980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
27990 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
279a0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
279b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
279c0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
279d0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
279e0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
279f0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
27a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27a10 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
27a20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
27a30 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
27a40 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
27a50 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
27a60 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
27a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
27a90 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
27aa0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
27ab0 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
27ac0 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
27ad0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
27ae0 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
27af0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
27b00 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
27b10 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
27b20 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
27b30 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
27b40 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
27b50 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
27b60 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
27b70 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
27b80 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
27b90 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
27ba0 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
27bb0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
27bc0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
27bd0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
27be0 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
27bf0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
27c00 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
27c10 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
27c20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27c30 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27c40 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
27c50 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
27c60 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
27c70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
27c80 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27c90 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
27ca0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
27cb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27cc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
27cd0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
27ce0 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
27cf0 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
27d00 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
27d10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
27d20 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
27d30 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
27d40 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
27d50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27d60 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
27d70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
27d80 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
27d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27da0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
27db0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
27dc0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
27dd0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
27de0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
27df0 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
27e00 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
27e10 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
27e20 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
27e30 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
27e40 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
27e50 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
27e60 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
27e70 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
27e80 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
27e90 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
27ea0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
27eb0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
27ec0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27ee0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
27ef0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
27f00 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
27f10 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
27f20 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
27f30 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
27f40 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
27f50 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
27f60 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
27f70 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
27f80 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
27f90 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
27fa0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
27fb0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
27fc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27fd0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
27fe0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
27ff0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
28000 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
28010 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
28020 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
28030 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
28040 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
28050 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
28060 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
28070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
28080 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OR;.  }.  if( pP
28090 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
280a0 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28  ==0 &&.        (
280b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
280c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
280d0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
280e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
280f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28100 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
28110 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
28120 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
28130 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
28140 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
28150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28160 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28170 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52  ager);.  PAGERTR
28180 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
28190 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
281a0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
281b0 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
281c0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
281d0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
281e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
281f0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
28200 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
28210 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
28220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
28230 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
28240 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
28250 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
28260 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
28270 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
28280 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
28290 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
282a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
282b0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
282c0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
282d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
282e0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
282f0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
28300 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
28310 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
28320 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
28330 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
28340 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
28350 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
28360 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
28370 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
28380 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28390 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
283a0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
283b0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
283c0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
283d0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
283e0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
283f0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
28400 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
28410 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
28420 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
28430 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
28440 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
28450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28460 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28470 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
28480 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
28490 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
284a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
284b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
284c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
284d0 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  aster);.  rc = p
284e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
284f0 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
28500 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28520 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
28530 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
28540 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
28550 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
28560 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
28570 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
28580 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
28590 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
285a0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
285b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
285c0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
285d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
285e0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
285f0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
28600 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
28610 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
28620 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
28630 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
28640 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
28650 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
28660 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
28670 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
28680 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
28690 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
286a0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
286b0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
286c0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
286d0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
286e0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
286f0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
28700 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
28710 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
28720 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
28730 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
28740 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
28750 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28760 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
28770 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
28780 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
28790 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
287a0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
287b0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
287c0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
287d0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
287e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
287f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
28800 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
28810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
28820 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
28830 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
28840 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
28850 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
28860 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
28870 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
28880 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
28890 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
288a0 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
288b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
288c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
288d0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
288e0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
288f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
28900 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
28910 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
28920 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
28930 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
28940 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
28950 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28960 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
28970 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
28980 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
28990 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
289a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
289b0 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
289c0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
289d0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
289e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
289f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a00 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
28a10 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
28a20 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
28a30 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
28a40 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
28a50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28a60 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
28a70 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
28a80 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
28a90 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
28aa0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
28ab0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
28ac0 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
28ad0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
28ae0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28af0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
28b00 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
28b10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
28b20 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
28b30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
28b40 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
28b50 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
28b60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28b70 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
28b80 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
28b90 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
28ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28bb0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45  K;.  }..  pagerE
28bc0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
28bd0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
28be0 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
28bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
28c00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
28c10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
28c20 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
28c30 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
28c40 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28c50 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
28c60 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
28c70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
28c80 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
28c90 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
28ca0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
28cb0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
28cc0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
28cd0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
28ce0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
28cf0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
28d00 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
28d10 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
28d20 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
28d30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
28d40 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
28d50 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
28d60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28d70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28d80 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  0);.    rc2 = pa
28d90 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
28da0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
28db0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
28dc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28de0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
28df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28e00 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
28e10 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
28e20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
28e30 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
28e40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28e50 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
28e60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
28e70 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
28e80 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
28e90 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
28ea0 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
28eb0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
28ec0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
28ed0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
28ee0 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
28ef0 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tent..  */.  rc 
28f00 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
28f10 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
28f20 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28f30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28f40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28f50 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
28f60 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
28f70 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
28f80 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
28f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28fa0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
28fb0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
28fc0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
28fd0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
28fe0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28ff0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
29000 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29010 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
29020 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
29030 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
29040 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
29050 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
29060 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
29070 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
29080 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
29090 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
290a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
290b0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
290c0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
290d0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
290e0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
290f0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
29100 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
29110 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
29120 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
29130 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
29140 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
29150 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
29160 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
29170 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
29180 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
29190 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
291a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
291b0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
291c0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
291d0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
291e0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
291f0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
29200 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
29210 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
29220 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
29230 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
29240 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
29250 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29260 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
29270 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
29280 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
29290 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
292a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
292b0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
292c0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
292d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
292e0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
292f0 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
29300 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
29310 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
29320 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
29330 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
29340 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
29350 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
29360 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
29370 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
29380 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
29390 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
293a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
293b0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
293c0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
293d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
293e0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
293f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29400 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
29410 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
29420 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
29430 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29440 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
29450 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
29460 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
29470 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
29480 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
29490 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
294a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
294b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
294c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
294d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
294e0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
294f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29500 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
29510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29520 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  pen );.  pagerLe
29530 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ave(pPager);.  a
29540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
29550 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  InStmt==0 );.  p
29560 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d  Pager->pInStmt =
29570 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
29580 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
29590 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  ize);.  pagerEnt
295a0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
295b0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
295c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
295d0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
295e0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
295f0 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
29600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29610 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  M;.  }.  pPager-
29620 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
29630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29640 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
29650 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
29660 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
29670 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
29680 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
29690 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
296a0 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
296b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
296c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
296d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
296e0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
296f0 2d 3e 73 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->stfd, SQLITE_O
29700 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
29710 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
29720 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
29730 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
29740 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
29750 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
29760 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
29770 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
29780 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
29790 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
297a0 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
297b0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
297c0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
297d0 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
297e0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
297f0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
29800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
29810 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
29820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
29830 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
29840 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
29850 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
29860 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
29870 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
29880 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
29890 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
298a0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
298b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
298c0 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
298d0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
298e0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
298f0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
29900 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
29910 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
29920 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
29930 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
29940 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
29950 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
29960 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
29970 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29980 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
29990 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
299a0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
299b0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
299c0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
299d0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
299e0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
299f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
29a00 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
29a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
29a20 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
29a30 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
29a40 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
29a50 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
29a60 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
29a70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29a80 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
29a90 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
29aa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29ab0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
29ac0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
29ad0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
29ae0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
29af0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
29b00 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
29b10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
29b20 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
29b30 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
29b40 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
29b50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
29b60 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
29b70 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
29b80 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
29b90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
29ba0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
29bb0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
29bc0 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65  n = 0;.  pagerLe
29bd0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
29be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
29c00 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
29c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
29c20 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
29c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29c40 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
29c50 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
29c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
29c70 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
29c80 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
29c90 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
29ca0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29cb0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
29cc0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
29cd0 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69  *pPg;.      PgHi
29ce0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
29cf0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
29d00 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
29d10 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74  pPg=pHist->pNext
29d20 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Stmt){.        p
29d30 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
29d40 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
29d50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
29d60 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
29d70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29d80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
29d90 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
29da0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
29db0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
29dc0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
29dd0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
29de0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29df0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
29e00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29e10 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
29e20 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
29e30 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72  ize;.      pager
29e40 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
29e50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
29e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29e80 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
29e90 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
29ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29eb0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
29ec0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
29ed0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
29ee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
29ef0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
29f00 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
29f10 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
29f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29f40 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
29f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29f60 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
29f70 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
29f80 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
29f90 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
29fa0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
29fb0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
29fc0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
29fd0 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
29fe0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
29ff0 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
2a000 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
2a010 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2a020 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
2a030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2a040 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
2a050 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
2a060 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
2a070 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
2a080 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
2a090 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
2a0a0 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
2a0b0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2a0c0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
2a0d0 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
2a0e0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
2a0f0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2a100 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
2a110 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2a120 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2a130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a140 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2a150 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
2a160 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2a170 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2a180 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
2a190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a1a0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2a1b0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
2a1c0 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
2a1d0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2a1e0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
2a1f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a200 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2a210 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
2a220 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2a230 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
2a240 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
2a250 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
2a260 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
2a270 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
2a280 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
2a290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2a2a0 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
2a2b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2a2c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
2a2d0 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
2a2e0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
2a2f0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
2a300 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
2a310 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
2a320 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
2a330 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2a340 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
2a350 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
2a360 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
2a370 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
2a380 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
2a390 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
2a3a0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
2a3b0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
2a3c0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
2a3d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a3e0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
2a3f0 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
2a400 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
2a410 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
2a420 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
2a430 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2a440 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
2a450 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
2a460 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
2a470 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
2a480 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
2a490 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
2a4a0 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
2a4b0 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
2a4c0 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  s located at pgn
2a4d0 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
2a4e0 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
2a4f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
2a500 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
2a510 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
2a520 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
2a530 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2a540 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
2a550 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
2a560 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
2a570 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
2a580 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
2a590 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
2a5a0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
2a5b0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
2a5c0 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
2a5d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2a5e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
2a5f0 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
2a600 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
2a610 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
2a620 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
2a630 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
2a640 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
2a650 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2a660 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
2a670 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
2a680 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
2a690 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
2a6a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
2a6b0 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
2a6c0 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
2a6d0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2a6e0 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
2a6f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2a700 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
2a710 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
2a720 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
2a730 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
2a740 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  d;  /* The page 
2a750 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
2a760 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20  n. */.  int h;. 
2a770 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
2a780 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72  no = 0;..  pager
2a790 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
2a7a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
2a7b0 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52  ef>0 );..  PAGER
2a7c0 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
2a7d0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
2a7e0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
2a7f0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
2a800 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2a810 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
2a820 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20  edSync, pgno);. 
2a830 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
2a840 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
2a850 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
2a860 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f  pgno))..  pager_
2a870 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
2a880 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ;.  if( pPg->nee
2a890 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
2a8a0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
2a8b0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
2a8c0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
2a8d0 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70  l || (int)pgno>p
2a8e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
2a8f0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
2a900 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
2a910 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a920 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
2a930 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
2a940 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73  pPg from its has
2a950 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
2a960 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
2a970 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
2a980 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
2a990 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
2a9a0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
2a9b0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
2a9c0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
2a9d0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
2a9e0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
2a9f0 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
2aa00 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
2aa10 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
2aa20 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
2aa30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
2aa40 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
2aa50 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
2aa60 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
2aa70 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
2aa80 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
2aa90 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
2aaa0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
2aab0 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
2aac0 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
2aad0 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
2aae0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
2aaf0 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
2ab00 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
2ab10 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
2ab20 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65  ync = pPgOld->ne
2ab30 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b  edSync;.  }else{
2ab40 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
2ab50 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  nc = 0;.  }.  pP
2ab60 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  g->inJournal = s
2ab70 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2ab80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2ab90 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f  nal, pgno);..  /
2aba0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
2abb0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
2abc0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
2abd0 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
2abe0 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73  -chain. */.  ass
2abf0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
2ac00 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
2ac10 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26  no;.  h = pgno &
2ac20 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
2ac30 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  1);.  if( pPager
2ac40 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
2ac50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ac60 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
2ac70 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
2ac80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2ac90 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
2aca0 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
2acb0 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
2acc0 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
2acd0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
2ace0 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
2acf0 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d  evHash = 0;..  m
2ad00 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
2ad10 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
2ad20 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  che = 1;.  pPage
2ad30 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
2ad40 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
2ad50 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
2ad60 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
2ad70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2ad80 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2ad90 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
2ada0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
2adb0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
2adc0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
2add0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
2ade0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
2adf0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
2ae00 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
2ae10 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
2ae20 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
2ae30 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49  .    ** Pager.pI
2ae40 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
2ae50 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
2ae60 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
2ae70 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
2ae80 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
2ae90 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
2aea0 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
2aeb0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2aec0 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
2aed0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
2aee0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
2aef0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
2af00 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
2af10 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
2af20 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
2af30 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
2af40 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
2af50 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
2af60 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
2af70 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
2af80 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
2af90 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
2afa0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
2afb0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
2afc0 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
2afd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2afe0 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
2aff0 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
2b000 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2b010 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
2b020 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
2b030 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2b040 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
2b050 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
2b060 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
2b070 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
2b080 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
2b090 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
2b0a0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
2b0b0 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
2b0c0 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
2b0d0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
2b0e0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
2b0f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2b100 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
2b110 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b120 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
2b130 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b140 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2b150 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
2b160 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
2b170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b180 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
2b190 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
2b1a0 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
2b1b0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
2b1c0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
2b1d0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2b1e0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
2b1f0 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
2b200 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
2b210 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
2b220 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2b230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b240 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
2b250 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2b260 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63  pPgHdr->needSync
2b270 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
2b280 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
2b290 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70  .    makeDirty(p
2b2a0 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
2b2b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2b2c0 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61  gHdr);.  }..  pa
2b2d0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
2b2e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2b2f0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
2b300 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2b310 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
2b320 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
2b330 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2b340 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2b350 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
2b360 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
2b370 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
2b380 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2b390 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2b3a0 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
2b3b0 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
2b3c0 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
2b3d0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
2b3e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2b3f0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
2b400 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2b410 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
2b420 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b430 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2b440 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
2b450 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
2b460 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
2b470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
2b480 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
2b490 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
2b4a0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
2b4b0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
2b4c0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
2b4d0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
2b4e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b4f0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
2b500 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b510 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
2b520 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
2b530 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
2b540 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
2b550 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
2b560 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
2b570 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2b580 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2b590 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
2b5a0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2b5b0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
2b5c0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2b5d0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2b5e0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2b5f0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
2b600 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
2b610 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b620 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
2b630 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2b640 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2b650 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2b660 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
2b670 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2b680 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2b690 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
2b6a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b6b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2b6c0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2b6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2b6e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b6f0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
2b700 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2b710 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
2b720 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
2b730 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
2b740 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2b750 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
2b760 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
2b770 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2b780 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
2b790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2b7a0 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
2b7b0 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
2b7c0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
2b7d0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
2b7e0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
2b7f0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
2b800 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
2b810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
2b820 55 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f 55 52  UERY, PAGER_JOUR
2b830 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f  NALMODE_DELETE o
2b840 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  r .** PAGER_JOUR
2b850 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
2b860 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
2b870 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
2b880 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75   then.** the jou
2b890 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74  rnal-mode is set
2b8a0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
2b8b0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
2b8c0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
2b8d0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
2b8e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
2b8f0 4c 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47 45 52  LETE or.** PAGER
2b900 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2b910 53 49 53 54 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIST, indicating
2b920 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
2b930 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
2b940 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  ** journal-mode.
2b950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b960 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
2b970 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2b980 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
2b990 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
2b9a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2b9b0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
2b9c0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2b9d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2b9e0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
2b9f0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2ba00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2ba10 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
2ba20 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2ba30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2ba40 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2ba50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2ba60 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
2ba70 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2ba80 4d 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30 20 26  MODE_DELETE>=0 &
2ba90 26 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  & PAGER_JOURNALM
2baa0 4f 44 45 5f 50 45 52 53 49 53 54 3e 3d 30 20 29  ODE_PERSIST>=0 )
2bab0 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
2bac0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2bad0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d  journalMode = eM
2bae0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
2baf0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
2bb00 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
2bb10 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
2bb20 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64   size-limit used
2bb30 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
2bb40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
2bb50 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
2bb60 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
2bb70 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
2bb80 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
2bb90 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
2bba0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2bbb0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2bbc0 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
2bbd0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
2bbe0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
2bbf0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2bc00 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69  E_TEST./*.** Pri
2bc10 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
2bc20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
2bc30 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
2bc40 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
2bc50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
2bc60 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
2bc70 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
2bc80 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
2bc90 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
2bca0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
2bcb0 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
2bcc0 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
2bcd0 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
2bce0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
2bcf0 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
2bd00 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
2bd10 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
2bd20 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
2bd30 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
2bd40 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
2bd50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bd60 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.