/ Hex Artifact Content
Login

Artifact e72e92d44365d75563d26957e6ba4a2ec0796da5:


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 35 31  : pager.c,v 1.51
0350: 31 20 32 30 30 38 2f 31 32 2f 31 30 20 31 36 3a  1 2008/12/10 16:
0360: 34 35 3a 35 31 20 64 72 68 20 45 78 70 20 24 0a  45:51 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
03f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0400: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0410: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0430: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0440: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0450: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0460: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
0470: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0480: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
0490: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04a0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04b0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04c0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
04d0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
04e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04f0: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0500: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0510: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0520: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0530: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0540: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0550: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0560: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
0590: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05a0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05c0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
05d0: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
05e0: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
05f0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0600: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0610: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0620: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0630: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0640: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0650: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0660: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
0670: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
0680: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
0690: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06a0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06b0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06c0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
06d0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06e0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
06f0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0700: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0710: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0720: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0730: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0740: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0750: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0760: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0770: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0780: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0790: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07a0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07b0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07e0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
07f0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0810: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0820: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0830: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0860: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0870: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0880: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0890: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08c0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08d0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0900: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0910: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0920: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0930: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0940: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0960: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0970: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0980: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
0990: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09b0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09c0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09d0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09e0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a10: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a20: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a30: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a70: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a90: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0aa0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ab0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ac0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0ae0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0af0: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b00: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b10: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b40: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b50: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b60: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b70: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0b90: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0ba0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bb0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0be0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0bf0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c00: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c10: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c20: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c30: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c50: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c60: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c70: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0ca0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cb0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0ce0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0cf0: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d00: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0d70: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0d80: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0d90: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0da0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0db0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0dc0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0dd0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0de0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0df0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e00: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e10: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e20: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e30: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e40: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e50: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e60: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0e70: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0e80: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0e90: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ea0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0eb0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ec0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ed0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0ee0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ef0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f00: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f10: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f20: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f30: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f40: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f50: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f60: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0f70: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0f80: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0f90: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fa0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fb0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0fc0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
0fd0: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
0fe0: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
0ff0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1000: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1020: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1030: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1040: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1050: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1060: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
1070: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
1080: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
1090: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10a0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10b0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10c0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
10d0: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
10e0: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
10f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1100: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1110: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1120: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1130: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1140: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1150: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1160: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
1170: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
1180: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
1190: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11a0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11c0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
11d0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
11e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
11f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1200: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1210: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1220: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1230: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1240: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1250: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1260: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1270: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
1280: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
1290: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12a0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12b0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12c0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
12d0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12e0: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
12f0: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1300: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1310: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1320: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1330: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1340: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1350: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1360: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1370: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1380: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
1390: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13a0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13b0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13c0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
13d0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13e0: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
13f0: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1400: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1410: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1420: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1430: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1440: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1450: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1460: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
1470: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
1480: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
1490: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14a0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14b0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
14d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
14e0: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
14f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1510: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1520: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1530: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1540: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1550: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1560: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
1570: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
1580: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
1590: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15a0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15b0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15c0: 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  )&~7)../*.** A m
15d0: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
15e0: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
15f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1600: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1610: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1620: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1630: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1640: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1650: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1660: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
1670: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
1680: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
1690: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
16a0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
16b0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
16d0: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
16e0: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
16f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1700: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1710: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1720: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1730: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1740: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1750: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
1760: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
1770: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
1780: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
1790: 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51  UPT, or.** or SQ
17a0: 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20  LITE_FULL. Once 
17b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  one of the first
17c0: 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63   three errors oc
17d0: 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74  curs, it persist
17e0: 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75  s.** and is retu
17f0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
1800: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
1810: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
1820: 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
1830: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
1840: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
1850: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
1860: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
1870: 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63  the.** next succ
1880: 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20  essful rollback 
1890: 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  is performed on 
18a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
18b0: 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45   Also,.** SQLITE
18c0: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
18d0: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
18e0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
18f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1900: 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68  up().** APIs, th
1910: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
1920: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
1930: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  y..*/.struct Pag
1940: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
1950: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
1960: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
1970: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
1980: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1990: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
19a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
19b0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19c0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
19d0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
19e0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
19f0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
1a00: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
1a10: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
1a20: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
1a40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a50: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
1a60: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
1a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a80: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1a90: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
1aa0: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
1ab0: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
1ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ad0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1ae0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
1af0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
1b00: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
1b10: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
1b20: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
1b30: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
1b50: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
1b60: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
1b70: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
1b80: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
1b90: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
1bc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
1bd0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
1be0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
1bf0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
1c00: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
1c10: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
1c20: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
1c30: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
1c40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1c50: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
1c60: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
1c70: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
1c90: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
1ca0: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
1cb0: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
1cc0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
1cd0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1ce0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
1cf0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
1d00: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d20: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
1d30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
1d40: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d60: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
1d70: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
1d80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1d90: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1db0: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
1dc0: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
1dd0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1de0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1df0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
1e00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
1e10: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
1e20: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
1e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e40: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
1e50: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
1e60: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
1e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e80: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
1e90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1ea0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
1eb0: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1ed0: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
1ee0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
1ef0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
1f00: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1f20: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
1f40: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
1f50: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
1f60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
1f70: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
1f80: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
1f90: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
1fa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1fb0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
1fc0: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
1fd0: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
1fe0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
1ff0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
2000: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
2010: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
2020: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
2030: 20 64 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20   dbSizeValid;   
2040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
2050: 20 77 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20   when dbSize is 
2060: 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20 75 33 32  correct */.  u32
2070: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
2080: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2090: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
20a0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
20b0: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
20c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
20d0: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
20e0: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
20f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2110: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2120: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
2130: 20 20 50 67 6e 6f 20 6f 72 69 67 44 62 53 69 7a    Pgno origDbSiz
2140: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2150: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
2160: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
2170: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 73 74 6d 74  e */.  Pgno stmt
2180: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2190: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
21a0: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
21b0: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
21c0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21f0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
2200: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2210: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2230: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
2240: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
2250: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
2260: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2280: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
2290: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
22a0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
22b0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
22c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
22d0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
22e0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
22f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
2300: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
2310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2320: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
2330: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
2340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2350: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2360: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2370: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  pages */.  int m
2380: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2390: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23a0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
23b0: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
23c0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
23d0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
23e0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
23f0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
2400: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2410: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
2420: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
2430: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2440: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2450: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2460: 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b  Bitvec *pInStmt;
2470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2480: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2490: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
24a0: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
24b0: 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63   *pAlwaysRollbac
24c0: 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74  k;    /* One bit
24d0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 6d   for each page m
24e0: 61 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f 6c  arked always-rol
24f0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  lback */.  char 
2500: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
2510: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2520: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2530: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2540: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2550: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2560: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
2580: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
2590: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
25a0: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
25b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
25c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
25d0: 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20   *fd, *jfd;     
25e0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
25f0: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
2600: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
2610: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2620: 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  stfd;         /*
2630: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2640: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
2650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
2660: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
2670: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
2680: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
2690: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
26a0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
26b0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
26c0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
26d0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
26e0: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  r */.  i64 journ
26f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
2700: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2710: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
2720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2730: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
2740: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2750: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
2760: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
2770: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
2780: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
27a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
27b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
27c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
27d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
27e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
27f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
2800: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
2810: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
2820: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2830: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
2840: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
2850: 67 69 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  gin() */.  u32 s
2860: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
2870: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
2880: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
2890: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
28a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
28c0: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
28d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
28e0: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
28f0: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
2900: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
2910: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2920: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
2930: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
2940: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
2950: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
2960: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2970: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2990: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
29a0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
29b0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
29c0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
29d0: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
29e0: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
29f0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
2a00: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
2a10: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
2a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
2a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
2a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
2a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
2a70: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
2a80: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
2a90: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
2aa0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
2ab0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
2ac0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2ad0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
2ae0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
2af0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
2b00: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
2b10: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
2b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2b30: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
2b40: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
2b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
2b60: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
2b70: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
2b80: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
2b90: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
2ba0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
2bb0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
2bc0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
2bd0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
2be0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
2bf0: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
2c00: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
2c10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2c20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2c30: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
2c40: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
2c50: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
2c60: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
2c70: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2c80: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
2c90: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
2ca0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
2cb0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
2cc0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2cd0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
2ce0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
2cf0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2d00: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
2d10: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2d20: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
2d30: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
2d40: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
2d50: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2d60: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2d70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2d80: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2d90: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2da0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2db0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
2dc0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
2dd0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
2de0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
2df0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
2e00: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
2e10: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
2e20: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2e30: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
2e40: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
2e50: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
2e60: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
2e70: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2e80: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2e90: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2ea0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
2eb0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
2ec0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2ed0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2ee0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2ef0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2f00: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2f10: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
2f20: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
2f30: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
2f40: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
2f50: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
2f60: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
2f70: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2f80: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2f90: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2fa0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2fb0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2fc0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
2fd0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2fe0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2ff0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
3000: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
3010: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
3020: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
3030: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
3040: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
3050: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3060: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3070: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3080: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3090: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
30a0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
30b0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
30c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
30d0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
30e0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
30f0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3100: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3110: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
3120: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
3130: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
3140: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3150: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3160: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3170: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3180: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3190: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
31a0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
31b0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
31c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31d0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
31e0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
31f0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3200: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3210: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
3220: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
3230: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
3240: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
3250: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
3260: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
3270: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3280: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3290: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
32a0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
32b0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
32c0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
32d0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
32e0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
32f0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3300: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
3310: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
3320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
3330: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
3340: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
3350: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
3360: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
3370: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
3380: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
3390: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
33a0: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
33b0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
33c0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
33d0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
33e0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
33f0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
3400: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
3410: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
3420: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
3430: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
3440: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
3450: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
3460: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
3470: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
3480: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
3490: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
34a0: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
34b0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
34c0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
34d0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
34e0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
34f0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
3500: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
3510: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
3520: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
3530: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
3540: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
3550: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
3560: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
3570: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
3580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
3590: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
35a0: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
35b0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
35c0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
35d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
35e0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
35f0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3600: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3610: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3620: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3630: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3640: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3650: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3660: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3680: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3690: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
36a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
36b0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
36c0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
36d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
36e0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
36f0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3700: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3710: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3720: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3730: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3740: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3750: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3760: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3770: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3780: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3790: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
37a0: 28 28 50 67 6e 6f 29 28 28 50 45 4e 44 49 4e 47  ((Pgno)((PENDING
37b0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
37c0: 53 69 7a 65 29 29 2b 31 29 29 0a 0a 2f 2a 0a 2a  Size))+1))../*.*
37d0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
37e0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
37f0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
3800: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3810: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
3820: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  647../*.** Retur
3830: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
3840: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
3850: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3860: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
3870: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
3880: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
3890: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
38a0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
38b0: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
38c0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
38d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
38e0: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
38f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
3900: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
3910: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
3920: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
3930: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
3940: 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
3950: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3960: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
3970: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
3980: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
3990: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
39a0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
39b0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
39c0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
39d0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
39e0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
39f0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
3a00: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
3a10: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
3a20: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
3a30: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
3a40: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
3a50: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
3a60: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
3a70: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
3a80: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
3a90: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
3aa0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
3ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
3ac0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
3ad0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
3ae0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
3af0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
3b00: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
3b10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3b20: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
3b30: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
3b40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3b50: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
3b60: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
3b70: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
3b80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3b90: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3ba0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
3bb0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
3bc0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
3bd0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
3be0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
3bf0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
3c00: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
3c10: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
3c20: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
3c30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
3c40: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
3c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
3c60: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
3c70: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
3c80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3c90: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
3ca0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
3cb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
3cc0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
3cd0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
3ce0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
3cf0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
3d00: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
3d10: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
3d20: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
3d30: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
3d40: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
3d50: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
3d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3d70: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
3d80: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
3d90: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
3da0: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
3db0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3dc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
3dd0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
3de0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
3df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3e00: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
3e10: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
3e20: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
3e30: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
3e40: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
3e50: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
3e60: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
3e70: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
3e80: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
3e90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
3ea0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
3eb0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
3ec0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
3ed0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
3ee0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
3ef0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
3f00: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
3f10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3f20: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
3f30: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
3f40: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
3f50: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
3f60: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
3f70: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
3f80: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
3f90: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
3fa0: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
3fb0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
3fc0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
3fd0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3fe0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
3ff0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
4000: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
4010: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
4020: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4030: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
4040: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
4050: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
4060: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
4070: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
4080: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
4090: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
40a0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
40b0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
40c0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  */.  int szPage;
40d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
40e0: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
40f0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
4100: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
4110: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
4120: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
4130: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
4140: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
4150: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
4160: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
4170: 64 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  d);.    szPage =
4180: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
4190: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
41a0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
41b0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
41c0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
41d0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
41e0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
41f0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
4200: 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20  ethods || .     
4210: 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f    (dc & (SQLITE_
4220: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
4230: 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65  Page>>8)) && nSe
4240: 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b  ctor<=szPage) ){
4250: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
4280: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
4290: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
42a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
42b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
42c0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
42d0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
42e0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
42f0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
4300: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
4310: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4320: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
4330: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
4340: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
4350: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
4360: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
4370: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
4380: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
4390: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
43a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
43b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
43c0: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
43d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
43e0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
43f0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
4400: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
4410: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
4420: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
4430: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
4440: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
4450: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
4460: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
4470: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
4480: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
4490: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
44a0: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
44b0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
44c0: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
44d0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
44e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
44f0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
4500: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
4510: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
4520: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
4530: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
4540: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
4550: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4560: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
4570: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
4580: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
4590: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
45a0: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
45b0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
45c0: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
45d0: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
45e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
45f0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
4600: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
4610: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4620: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4630: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4640: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4650: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
4660: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
4670: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4680: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
4690: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
46a0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
46b0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
46c0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
46d0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
46e0: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
46f0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4700: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4710: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4720: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
4730: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
4740: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
4750: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4760: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
4770: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
4780: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
4790: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
47a0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
47b0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
47c0: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
47d0: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
47e0: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
47f0: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
4800: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
4810: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
4820: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
4830: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
4840: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
4850: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
4860: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
4870: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4890: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
48a0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
48b0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
48c0: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
48d0: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
48e0: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
48f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
4900: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4910: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
4920: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
4940: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
4950: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
4960: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
4970: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
4980: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
4990: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
49a0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
49b0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
49c0: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
49d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
49e0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
49f0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4a00: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
4a10: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
4a20: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
4a30: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
4a40: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
4a50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
4a60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
4a70: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
4a80: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
4a90: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
4aa0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
4ab0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
4ac0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4ad0: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
4ae0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
4af0: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
4b10: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
4b20: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
4b30: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
4b40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4b50: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
4b60: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
4b70: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
4b80: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
4b90: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
4ba0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
4bb0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
4bc0: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
4bd0: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
4be0: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
4bf0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
4c00: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
4c10: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
4c20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
4c30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
4c40: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
4c50: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
4c60: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
4c70: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
4c80: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
4c90: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
4ca0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
4cb0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
4cc0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
4cd0: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
4ce0: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
4cf0: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
4d00: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
4d10: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
4d20: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
4d30: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
4d40: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
4d50: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
4d60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
4d70: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
4d80: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
4d90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4da0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
4db0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
4dc0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
4dd0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
4de0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
4df0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
4e00: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
4e10: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
4e20: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
4e30: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
4e40: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
4e50: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
4e60: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
4e70: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
4e80: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
4e90: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
4ea0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
4eb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
4ec0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
4ed0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4ee0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
4ef0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
4f00: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
4f10: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
4f20: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
4f30: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
4f40: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
4f50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4f60: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
4f70: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
4f80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
4f90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4fa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4fb0: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
4fc0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
4fd0: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
4fe0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
4ff0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5000: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5010: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5020: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5030: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5040: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5050: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5060: 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75  2 cksum;.  u32 u
5070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5080: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
5090: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
50a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
50b0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
50c0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
50d0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
50e0: 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d  */..  zMaster[0]
50f0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d   = '\0';..  rc =
5100: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5110: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
5120: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5130: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5140: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5150: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5160: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
5170: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5180: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5190: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e  n rc;..  if( len
51a0: 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  >=nMaster ){.   
51b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
51c0: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  K;.  }..  rc = r
51d0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
51e0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
51f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5200: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5210: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5220: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5230: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
5240: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5250: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
5260: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5270: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5280: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5290: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
52a0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
52b0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
52c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
52d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
52e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  n rc;.  }.  zMas
52f0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
5300: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
5310: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
5320: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
5330: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
5340: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
5350: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
5360: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
5370: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5380: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5390: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
53a0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
53b0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
53c0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
53d0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
53e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
53f0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
5400: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
5410: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
5420: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
5430: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5440: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5450: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5460: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5470: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5480: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
5490: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  r[0] = '\0';.  }
54a0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
54b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
54c0: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
54d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
54e0: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
54f0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
5500: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
5510: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
5520: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
5530: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
5540: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5550: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5560: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5570: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5580: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5590: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
55b0: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 65  .static void see
5680: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5690: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
56a0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
56b0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
56c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
56d0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
56e0: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
56f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5700: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5710: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5720: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5730: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5740: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5760: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5770: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5780: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5790: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
57a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
57b0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
57c0: 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65   Write zeros ove
57d0: 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  r the header of 
57e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
57f0: 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
5800: 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76  ** effect of inv
5810: 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f  alidating the jo
5820: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63  urnal file and c
5830: 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a  ommitting the.**
5840: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
5850: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
5860: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5870: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
5880: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
5890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
58a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
58b0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
58c0: 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70   = {0};..  if( p
58d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
58e0: 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69  f ){.    i64 iLi
58f0: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
5900: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
5910: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
5920: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
5930: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
5940: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
5950: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
5960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
5970: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
5980: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
5990: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
59a0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
59b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
59c0: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
59d0: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
59e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
59f0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
5a00: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
5a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5a20: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
5a30: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
5a40: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
5a50: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
5a60: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
5a70: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
5a80: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
5a90: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
5aa0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
5ab0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
5ac0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
5ad0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
5ae0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
5af0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
5b00: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
5b10: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
5b20: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
5b30: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
5b40: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
5b50: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
5b60: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
5b70: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
5b80: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
5b90: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
5ba0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
5bb0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
5bc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5bd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
5be0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
5bf0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
5c00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
5c10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
5c20: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
5c30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5c40: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
5c50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5c60: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
5c70: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
5c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5c90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5cb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5cc0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5cd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5ce0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5cf0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5d00: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5d10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5d20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d30: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5d40: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5d50: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5d60: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5d70: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5d80: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5d90: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5da0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5db0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5dc0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5dd0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5de0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5df0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5e00: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5e10: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5e20: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5e30: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5e40: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5e50: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5e60: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5e70: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5e80: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5e90: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
5ea0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
5eb0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
5ec0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
5ed0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5ee0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
5ef0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
5f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
5f10: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
5f20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
5f30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5f40: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  ;.  char *zHeade
5f50: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
5f60: 53 70 61 63 65 3b 0a 20 20 75 33 32 20 6e 48 65  Space;.  u32 nHe
5f70: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
5f80: 61 67 65 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  ageSize;.  u32 n
5f90: 57 72 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48  Write;..  if( nH
5fa0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
5fb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
5fc0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
5fd0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5fe0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
5ff0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
6000: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
6010: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
6020: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6030: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65  alOff;.  }..  se
6040: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6050: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
6060: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
6070: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6080: 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  ..  memcpy(zHead
6090: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
60a0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
60b0: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a  alMagic));..  /*
60c0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
60d0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
60e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
60f0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
6100: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
6110: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
6120: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
6130: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
6140: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
6150: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
6160: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
6170: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
6180: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
6190: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
61a0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
61b0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
61c0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
61d0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
61e0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
61f0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
6200: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
6210: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
6220: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
6230: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
6240: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
6250: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
6260: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
6270: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
6280: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
6290: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
62a0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
62b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
62c0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
62d0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
62e0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
62f0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
6300: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
6310: 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
6320: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
6330: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
6340: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
6350: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
6360: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
6370: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
6380: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
6390: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
63a0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
63b0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
63c0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
63d0: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
63e0: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
63f0: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
6400: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
6410: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
6420: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
6430: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
6440: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
6450: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
6460: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
6470: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
6480: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
6490: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
64a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50    */.  assert(pP
64b0: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
64c0: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ds||pPager->noSy
64d0: 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  nc);.  if( (pPag
64e0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
64f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
6500: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
6510: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
6520: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
6530: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
6540: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
6550: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
6560: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
6570: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
6580: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6590: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
65a0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
65b0: 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62  else{.    put32b
65c0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
65d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
65e0: 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  c)], 0);.  }..  
65f0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
6600: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
6610: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
6620: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
6630: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
6640: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
6650: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6660: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6670: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6680: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
6690: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
66a0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
66b0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
66c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
66d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
66e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
66f0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
6700: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6710: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6720: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6730: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6740: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6760: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
6770: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  orSize);..  /* I
6780: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
6790: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
67a0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
67b0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
67c0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
67d0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
67e0: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
67f0: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
6800: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
6810: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
6820: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
6830: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
6840: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
6850: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
6860: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
6870: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
6880: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6890: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
68a0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
68b0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
68c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
68d0: 29 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  ));..  if( pPage
68e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30  r->journalHdr==0
68f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
6900: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
6910: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6920: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6930: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
6940: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
6950: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69  .  }..  for(nWri
6960: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
6970: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
6980: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6990: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
69a0: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
69b0: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
69c0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
69d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
69e0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
69f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6a00: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
6a10: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
6a20: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
6a30: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50  rnalOff);.    pP
6a40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a50: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
6a60: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6a70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6a80: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6a90: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6aa0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6ac0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
6ad0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
6ae0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
6af0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
6b00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
6b10: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
6b20: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
6b30: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
6b40: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6b50: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6b60: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6b70: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6b80: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6b90: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6ba0: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6bb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6bc0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
6bd0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
6be0: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
6bf0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
6c00: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
6c10: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
6c20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
6c30: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
6c40: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6c50: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6c60: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6c70: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6c80: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6c90: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6ca0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6cc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
6cd0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
6ce0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
6cf0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
6d00: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
6d10: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
6d20: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6d30: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6d40: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6d50: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6d60: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6d70: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6d80: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6d90: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6da0: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6db0: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6dc0: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
6dd0: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
6de0: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
6df0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
6e00: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
6e10: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6e20: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6e30: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
6e40: 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67  lOff;.  int iPag
6e50: 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f  eSize;..  seekJo
6e60: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6e70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6e80: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6ea0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6ec0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
6ed0: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
6ee0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
6ef0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6f00: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6f10: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6f20: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
6f30: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
6f40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
6f50: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
6f60: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
6f70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
6f80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6f90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
6fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6fb0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6fc0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6fd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6fe0: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
6ff0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7000: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
7010: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7020: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
7030: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
7040: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
7050: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7060: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7070: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7080: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
7090: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
70a0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
70b0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
70c0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36  >jfd, jrnlOff+16
70d0: 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53  , (u32 *)&iPageS
70e0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
70f0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
7100: 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   iPageSize>=512 
7110: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
7120: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
7130: 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28  E_SIZE .   && ((
7140: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
7150: 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b  geSize)==0 .  ){
7160: 0a 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a  .    u16 pagesiz
7170: 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20  e = iPageSize;. 
7180: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
7190: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
71a0: 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a  pPager, &pagesiz
71b0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
71e0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
71f0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
7200: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
7210: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
7220: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
7230: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
7240: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7250: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7260: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7270: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7280: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7290: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
72a0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
72b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
72c0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
72d0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
72e0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
72f0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
7300: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
7310: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
7320: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7330: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7340: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 73 65 63  12, &pPager->sec
7350: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
7360: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7370: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
7380: 65 63 74 6f 72 53 69 7a 65 20 26 20 28 70 50 61  ectorSize & (pPa
7390: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2d  ger->sectorSize-
73a0: 31 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  1))!=0.         
73b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  || pPager->secto
73c0: 72 53 69 7a 65 3e 30 78 31 30 30 30 30 30 30 20  rSize>0x1000000 
73d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
73e0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
73f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7400: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
7410: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
7420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7430: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
7440: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
7450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7460: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
7470: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7480: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
7490: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
74a0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
74b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
74c0: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
74d0: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
74e0: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
74f0: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
7500: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
7510: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
7520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
7530: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
7540: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
7550: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
7560: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
7570: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
7580: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
7590: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
75a0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
75b0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
75c0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
75d0: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
75e0: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
75f0: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
7600: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
7610: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
7620: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
7630: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
7640: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
7650: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
7660: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
7670: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
7680: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
7690: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
76a0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
76b0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
76c0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
76d0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
76e0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
76f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
7700: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
7710: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
7720: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
7730: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
7740: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7750: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
7760: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
7770: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
7780: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7790: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
77a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
77b0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
77c0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
77d0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
77e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
77f0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
7800: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7810: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7820: 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e 20  MEMORY ) return 
7830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
7840: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
7850: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
7860: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
7870: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
7880: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
7890: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
78a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
78b0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
78c0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
78d0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
78e0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
78f0: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
7900: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
7910: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
7920: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
7930: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
7940: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
7950: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
7960: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
7970: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
7980: 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61  {.    seekJourna
7990: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
79a0: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
79b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
79c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
79d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
79e0: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
79f0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
7a00: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41  jfd, jrnlOff, PA
7a10: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
7a20: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
7a30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7a40: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
7a50: 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73   += 4;..  rc = s
7a60: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7a70: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
7a80: 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66  er, len, jrnlOff
7a90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7aa0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7ab0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7ac0: 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69   len;..  put32bi
7ad0: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
7ae0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
7af0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7b00: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7b10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7b20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7b30: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7b40: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7b50: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7b60: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7b70: 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  lMagic), jrnlOff
7b80: 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  );.  jrnlOff += 
7b90: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7ba0: 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65  lMagic);.  pPage
7bb0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7bc0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a  Pager->noSync;..
7bd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
7be0: 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
7bf0: 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
7c00: 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
7c10: 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
7c20: 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
7c30: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
7c40: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7c50: 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
7c60: 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
7c70: 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
7c80: 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
7c90: 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
7ca0: 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
7cb0: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
7cc0: 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
7cd0: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
7ce0: 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
7cf0: 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
7d00: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
7d10: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
7d20: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
7d30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
7d40: 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
7d50: 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
7d60: 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
7d70: 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
7d80: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
7d90: 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
7da0: 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
7db0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63  .  */ .  if( (rc
7dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
7dd0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
7de0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
7df0: 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
7e00: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))==SQLITE_OK. 
7e10: 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72    && jrnlSize>jr
7e20: 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  nlOff.  ){.    r
7e30: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7e40: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
7e50: 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d  d, jrnlOff);.  }
7e60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7e70: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
7e80: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
7e90: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7ea0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7eb0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7ec0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
7ed0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
7ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
7ef0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
7f00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7f10: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
7f20: 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  Hdr *p;.  sqlite
7f30: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
7f40: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
7f50: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
7f60: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7f70: 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65   Clear the in-me
7f80: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69  mory cache.  Thi
7f90: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74  s routine.** set
7fa0: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
7fb0: 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
7fc0: 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65   what it was whe
7fd0: 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a  n it was first.*
7fe0: 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f  * opened.  Any o
7ff0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
8000: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
8010: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
8020: 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61  attempts.** to a
8030: 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65  ccess those page
8040: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  s will likely re
8050: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
8060: 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mp..*/.static vo
8070: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
8080: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
8090: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
80a0: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
80b0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
80c0: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
80d0: 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  che);.}../*.** U
80e0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
80f0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
8100: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8110: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
8120: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
8130: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
8140: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
8150: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
8160: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
8170: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
8180: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
8190: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
81a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
81b0: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
81c0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
81d0: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
81e0: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
81f0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
8200: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
8210: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
8220: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
8230: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
8240: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8250: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
8260: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
8270: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8280: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
8290: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
82a0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
82b0: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
82c0: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
82d0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
82e0: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
82f0: 3d 20 30 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  = 0;.    IOTRACE
8300: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
8310: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f   pPager))..    /
8320: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
8330: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8340: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
8350: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
8360: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
8370: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
8380: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
8390: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
83a0: 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65  ight.    ** dele
83b0: 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20  te the file out 
83c0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
83d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
83e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
83f0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
8400: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
8410: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
8420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8430: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  n = 0;.      sql
8440: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
8450: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
8460: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70 50 61  rnal);.      pPa
8470: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
8480: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
8490: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
84a0: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
84b0: 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  ollback);.      
84c0: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
84d0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
84e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61   }..    /* If Pa
84f0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
8500: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
8510: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
8520: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
8530: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
8540: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
8550: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8560: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
8570: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
8580: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
8590: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
85a0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
85b0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
85c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
85d0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
85e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
85f0: 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  K ) pPager->errC
8600: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
8610: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
8620: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
8630: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8640: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
8650: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8660: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
8670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
8680: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
8690: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
86a0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
86b0: 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
86c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
86d0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
86e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
86f0: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
8700: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8710: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
8720: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8730: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
8740: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
8750: 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  utoopen = 0;.   
8760: 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
8770: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bSize = 0;.    }
8780: 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
8790: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
87a0: 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  CK;.    pPager->
87b0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
87c0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
87d0: 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
87e0: 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
87f0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
8800: 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
8810: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
8820: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  . If the pager h
8830: 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
8840: 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
8850: 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61  te, .** do not a
8860: 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62  ttempt the rollb
8870: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
8880: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
8890: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
88a0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65   *p){.  if( p->e
88b0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
88c0: 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50  K && p->state>=P
88d0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
88e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
88f0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
8900: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8910: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
8920: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
8930: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
8940: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
8950: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
8960: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
8970: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
8980: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
8990: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
89a0: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
89b0: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
89c0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
89d0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
89e0: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
89f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8a00: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
8a10: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
8a20: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
8a30: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
8a40: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
8a50: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
8a60: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
8a70: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
8a80: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
8a90: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
8aa0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
8ab0: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
8ac0: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
8ad0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
8ae0: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
8af0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
8b00: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
8b10: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
8b20: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
8b30: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
8b40: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
8b50: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
8b60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
8b70: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
8b80: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
8b90: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
8ba0: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
8bb0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
8bc0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
8bd0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
8be0: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
8bf0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8c00: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
8c10: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
8c20: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
8c30: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
8c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8c50: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
8c60: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
8c70: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
8c80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
8c90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
8ca0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
8cb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8cc0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8cd0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8ce0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8cf0: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8d00: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8d10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
8d20: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
8d30: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8d40: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
8d50: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
8d60: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
8d70: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
8d80: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
8d90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8da0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
8db0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
8dc0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
8dd0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
8de0: 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79      int isMemory
8df0: 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
8e00: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
8e10: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8e20: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8e30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
8e40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8e50: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
8e60: 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f 72      if( !isMemor
8e70: 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  yJournal ){.    
8e80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8e90: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
8ea0: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
8eb0: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
8ec0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8ed0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8ee0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8ef0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
8f00: 54 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  TE.         && (
8f10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8f20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8f30: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
8f40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
8f50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8f60: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8f70: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8f80: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
8f90: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
8fa0: 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20  usiveMode .     
8fb0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
8fc0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8fd0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
8fe0: 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  T.    ){.      r
8ff0: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
9000: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
9010: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
9020: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
9030: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
9040: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
9050: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
9060: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
9070: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
9080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9090: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
90a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
90b0: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20  LMODE_DELETE || 
90c0: 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rc );.      sqli
90d0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
90e0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
90f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9100: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
9110: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9120: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
9130: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
9140: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
9150: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
9160: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
9170: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
9180: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9190: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
91a0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
91b0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
91c0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
91d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
91e0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
91f0: 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
9200: 6b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  k);.    pPager->
9210: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  pAlwaysRollback 
9220: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
9230: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
9240: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
9250: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
9260: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
9270: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
9280: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
9290: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
92a0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
92b0: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
92c0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
92d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
92e0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
92f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9300: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
9310: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
9320: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
9330: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
9340: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
9350: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
9360: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
9370: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
9380: 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73  R_SHARED;.  }els
9390: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
93a0: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
93b0: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
93c0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
93d0: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
93e0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
93f0: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
9400: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
9410: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
9420: 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72  ync = 0;.  /* lr
9430: 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e  uListSetFirstSyn
9440: 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  ced(pPager); */.
9450: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
9460: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
9470: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
9480: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
9490: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65  ified = 0;..  re
94a0: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
94b0: 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
94c0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
94d0: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
94e0: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
94f0: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
9500: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
9510: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
9520: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
9530: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
9540: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
9550: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
9560: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
9570: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
9580: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
9590: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
95a0: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
95b0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
95c0: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
95d0: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
95e0: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
95f0: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
9600: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
9610: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
9620: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
9630: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
9640: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
9650: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
9660: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
9670: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
9680: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
9690: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
96a0: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
96b0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
96c0: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
96d0: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
96e0: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
96f0: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
9700: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
9710: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
9720: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
9730: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
9740: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
9750: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
9760: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
9770: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
9780: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
9790: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
97a0: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
97b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
97c0: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
97d0: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
97e0: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
97f0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
9800: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
9810: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
9820: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
9830: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
9840: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
9850: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
9860: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
9870: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
9880: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
9890: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
98a0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
98b0: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
98c0: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
98d0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
98e0: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
98f0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
9900: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
9910: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
9920: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
9930: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
9940: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
9950: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
9960: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
9970: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
9980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
9990: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
99a0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
99b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
99c0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
99d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
99e0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
99f0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
9a00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
9a10: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
9a20: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
9a30: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
9a40: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
9a50: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
9a60: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
9a70: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
9a80: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
9a90: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
9aa0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
9ab0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
9ac0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
9ad0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
9ae0: 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
9af0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 2f 2a 20  Pager,       /* 
9b00: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
9b10: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
9b20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
9b30: 66 64 2c 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  fd,   /* The fil
9b40: 65 20 74 68 61 74 20 69 73 20 74 68 65 20 6a 6f  e that is the jo
9b50: 75 72 6e 61 6c 20 62 65 69 6e 67 20 72 6f 6c 6c  urnal being roll
9b60: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
9b70: 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
9b80: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 74    /* Offset of t
9b90: 68 65 20 70 61 67 65 20 77 69 74 68 69 6e 20 74  he page within t
9ba0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
9bb0: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 20  int isMainJrnl  
9bc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
9bd0: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
9be0: 6f 75 72 6e 61 6c 2e 20 46 61 6c 73 65 20 66 6f  ournal. False fo
9bf0: 72 20 53 74 6d 74 20 6a 72 6e 6c 20 2a 2f 0a 29  r Stmt jrnl */.)
9c00: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
9c10: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9c30: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
9c40: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
9c50: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
9c80: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
9c90: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
9ca0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9cc0: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
9cd0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
9ce0: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
9cf0: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
9d00: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
9d10: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
9d20: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
9d30: 69 73 4d 61 69 6e 4a 72 6e 6c 20 73 68 6f 75 6c  isMainJrnl shoul
9d40: 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68  d be true for th
9d50: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
9d60: 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a  nd false for.  *
9d70: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
9d80: 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68  nals.  Verify th
9d90: 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  at this is alway
9da0: 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a  s the case.  */.
9db0: 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d    assert( jfd ==
9dc0: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70   (isMainJrnl ? p
9dd0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
9de0: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
9df0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
9e00: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
9e10: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
9e20: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
9e30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
9e40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
9e50: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
9e60: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
9e70: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
9e80: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
9e90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
9ea0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
9eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9ec0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9ed0: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
9ee0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
9ef0: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
9f00: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
9f10: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
9f20: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
9f30: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
9f40: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
9f50: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
9f60: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
9f70: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
9f80: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
9f90: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
9fa0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9fb0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
9fc0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
9fd0: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
9fe0: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
9ff0: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
a000: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
a010: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
a020: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
a030: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
a040: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a050: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
a060: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
a070: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
a080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a090: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
a0a0: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
a0b0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
a0c0: 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d  , offset+pPager-
a0d0: 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
a0e0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
a0f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a100: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a110: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
a120: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
a130: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
a140: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
a150: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
a170: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
a180: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
a190: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
a1a0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
a1b0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
a1c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a1d0: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
a1e0: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
a1f0: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
a200: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
a210: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
a220: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
a230: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
a240: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
a250: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
a260: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
a270: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
a280: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
a290: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
a2a0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
a2b0: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
a2c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
a2d0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
a2e0: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
a2f0: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
a300: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
a310: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
a320: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
a330: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
a340: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
a350: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
a360: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
a370: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
a380: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
a390: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
a3a0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
a3b0: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
a3c0: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
a3d0: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
a3e0: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
a3f0: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
a400: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
a410: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
a420: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
a430: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
a440: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
a450: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
a460: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
a470: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
a480: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
a490: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
a4a0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
a4b0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
a4c0: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
a4d0: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
a4e0: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
a4f0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
a500: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
a510: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
a520: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
a530: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
a540: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
a550: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
a560: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
a570: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
a580: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
a590: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
a5a0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
a5b0: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
a5c0: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
a5d0: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
a5e0: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
a5f0: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
a600: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
a610: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
a620: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
a630: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
a640: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
a650: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
a660: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
a670: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
a680: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
a690: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
a6a0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
a6b0: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
a6c0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
a6d0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
a6e0: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
a6f0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
a700: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
a710: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
a720: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
a730: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
a740: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
a750: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
a760: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
a770: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
a780: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
a790: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
a7a0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
a7b0: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
a7c0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
a7d0: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
a7e0: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
a7f0: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
a800: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
a810: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
a820: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
a830: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
a840: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
a850: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
a860: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
a870: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
a880: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
a890: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
a8a0: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
a8b0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
a8c0: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
a8d0: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
a8e0: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
a8f0: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
a900: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
a910: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
a920: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
a930: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
a940: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
a950: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
a960: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
a970: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
a980: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
a990: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
a9a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
a9b0: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
a9c0: 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
a9d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29  PAGER_EXCLUSIVE)
a9e0: 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  .   && (pPg==0 |
a9f0: 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
aa00: 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
aa10: 29 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  )).   && (pPager
aa20: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
aa30: 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
aa40: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
aa50: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
aa60: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
aa70: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
aa80: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
aa90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
aaa0: 20 6f 66 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66   ofst);.  }.  if
aab0: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
aac0: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
aad0: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
aae0: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
aaf0: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
ab00: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
ab10: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
ab20: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
ab30: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
ab40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
ab50: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
ab60: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
ab70: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
ab80: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
ab90: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
aba0: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
abb0: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
abc0: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
abd0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
abe0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
abf0: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
ac00: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
ac10: 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
ac20: 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
ac30: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
ac40: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
ac50: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ac60: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
ac70: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
ac80: 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
ac90: 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  }.    if( isMain
aca0: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Jrnl ){.      sq
acb0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
acc0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
acd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
ace0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
acf0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
ad00: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
ad10: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
ad20: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
ad30: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
ad40: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
ad50: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
ad60: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
ad70: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
ad80: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
ad90: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
ada0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
adb0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
adc0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
add0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
ade0: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
adf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
ae00: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
ae10: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
ae20: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
ae30: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
ae40: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73  >pgno, 3);.    s
ae50: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
ae60: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
ae70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ae80: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
ae90: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
aea0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
aeb0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
aec0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
aed0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
aee0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
aef0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
af00: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
af10: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
af20: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
af30: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
af40: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
af60: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
af70: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
af80: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
af90: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
afa0: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
afb0: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
afc0: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
afd0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
afe0: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
aff0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
b000: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b010: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
b020: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
b030: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
b040: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
b050: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
b060: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
b070: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
b080: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
b090: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
b0a0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
b0b0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
b0c0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
b0d0: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
b0e0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
b0f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b100: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
b110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
b120: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
b130: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
b140: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
b150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
b160: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
b170: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
b180: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
b190: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
b1a0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
b1b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
b1c0: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
b1d0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
b1e0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
b1f0: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
b200: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
b210: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
b220: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
b230: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
b240: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
b250: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
b260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
b270: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
b280: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
b290: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
b2a0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
b2b0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
b2c0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
b2d0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
b2e0: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
b2f0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b300: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56  sqlite3Malloc(pV
b310: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
b320: 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
b330: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b340: 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
b350: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
b360: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
b370: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
b380: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
b390: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c  else{.    int fl
b3a0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
b3b0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
b3c0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
b3d0: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
b3e0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
b3f0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
b400: 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
b410: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
b420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b430: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b440: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
b450: 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   1;..  rc = sqli
b460: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
b470: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
b480: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
b490: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b4a0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b4b0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
b4c0: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
b4d0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
b4e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
b4f0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
b500: 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
b510: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
b520: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
b530: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
b540: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
b550: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
b560: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
b570: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
b580: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
b590: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
b5a0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
b5b0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
b5c0: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
b5d0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e  )sqlite3Malloc(n
b5e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
b5f0: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
b600: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
b610: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
b620: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b630: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
b640: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
b650: 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
b660: 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
b670: 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
b680: 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
b690: 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
b6a0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
b6b0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
b6c0: 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
b6d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b6e0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b6f0: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
b700: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
b710: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
b720: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
b730: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
b740: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
b750: 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
b760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b770: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
b780: 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
b790: 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
b7a0: 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28  ists);.      if(
b7b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b7c0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
b7d0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
b7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b7f0: 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
b800: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
b810: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
b820: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
b830: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
b840: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
b850: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
b860: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
b870: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b880: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
b890: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
b8a0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
b8b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b8c0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
b8d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
b8e0: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
b8f0: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
b900: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
b910: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
b920: 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  AL);.        rc 
b930: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
b940: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
b950: 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
b960: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b970: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b980: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
b990: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
b9a0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
b9b0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
b9c0: 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
b9d0: 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
b9e0: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
b9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
ba00: 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
ba10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
ba20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ba30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ba40: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ba50: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
ba60: 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
ba70: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
ba80: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
ba90: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
baa0: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
bab0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
bac0: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
bad0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
bae0: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
baf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
bb00: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
bb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bb20: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
bb30: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
bb40: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
bb50: 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
bb60: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
bb70: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
bb80: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
bb90: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
bba0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
bbb0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
bbc0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
bbd0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
bbe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
bbf0: 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
bc00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
bc10: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
bc20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
bc30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
bc40: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
bc50: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
bc60: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
bc70: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
bc80: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
bc90: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
bca0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
bcb0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
bcc0: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
bcd0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
bce0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d  he file..**.** M
bcf0: 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
bd00: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
bd10: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
bd20: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61  smaller than nPa
bd30: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  ge..** This can 
bd40: 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
bd50: 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69  ple, if we are i
bd60: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
bd70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
bd80: 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e   which has exten
bd90: 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ded the file siz
bda0: 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61  e and the new pa
bdb0: 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c  ges are still al
bdc0: 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63  l held.** in cac
bdd0: 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45  he, then an INSE
bde0: 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65  RT or UPDATE doe
bdf0: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  s a statement ro
be00: 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a  llback.  Some.**
be10: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
be20: 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
be30: 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
be40: 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f  ed if you try to
be50: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66  .** truncate a f
be60: 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
be70: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
be80: 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c  than it currentl
be90: 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65  y is,.** so dete
bea0: 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
beb0: 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
bec0: 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65  zero byte to the
bed0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a   end of the new.
bee0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ** file instead.
bef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bf00: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
bf10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bf20: 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
bf30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bf40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
bf50: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
bf60: 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e  SIVE && pPager->
bf70: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
bf80: 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
bf90: 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
bfa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bfb0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bfc0: 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
bfd0: 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
bfe0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
bff0: 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ze*(i64)nPage;. 
c000: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c010: 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
c020: 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
c030: 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
c040: 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
c050: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c060: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
c070: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
c080: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
c090: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
c0a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
c0b0: 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31  Pager->fd, "", 1
c0c0: 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20  , newSize-1);.  
c0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c0e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c0f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
c100: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
c110: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
c120: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
c130: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
c140: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
c150: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
c160: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
c170: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
c180: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
c190: 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20  at least as big 
c1a0: 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  as the sector si
c1b0: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
c1c0: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
c1d0: 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69  rSize().  The mi
c1e0: 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a  nimum sector siz
c1f0: 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  e is 512..*/.sta
c200: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
c210: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
c220: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
c230: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
c240: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
c250: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
c260: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c270: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
c280: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
c290: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
c2a0: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
c2b0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
c2c0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
c2d0: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
c2e0: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
c2f0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
c300: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
c310: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
c320: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
c330: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c340: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c350: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
c360: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
c370: 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
c380: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
c390: 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
c3a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
c3b0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
c3c0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
c3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c3e0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
c3f0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
c400: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
c410: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
c420: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c430: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
c440: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
c450: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
c460: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
c470: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
c480: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
c490: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
c4a0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c4b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c4c0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
c4d0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
c4e0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
c4f0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
c500: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
c510: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
c520: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
c530: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
c540: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
c550: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
c560: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c570: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c580: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c590: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
c5a0: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
c5b0: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
c5c0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
c5d0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c5e0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
c5f0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
c600: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
c610: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
c620: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
c630: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c640: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c650: 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
c660: 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
c670: 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
c680: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
c690: 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
c6a0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c6b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
c6c0: 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
c6d0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
c6e0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
c6f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
c700: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c710: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
c720: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
c730: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
c740: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
c750: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
c760: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
c770: 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
c780: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
c790: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
c7a0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
c7b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
c7c0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
c7d0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
c7e0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
c7f0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
c800: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
c810: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
c820: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
c830: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
c840: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
c850: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
c860: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
c870: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
c880: 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
c890: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
c8a0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
c8b0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
c8c0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
c8d0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
c8e0: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
c8f0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
c900: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
c910: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
c920: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
c930: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
c940: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
c950: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
c960: 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
c970: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
c980: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
c990: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
c9a0: 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
c9b0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
c9c0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
c9d0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
c9e0: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
c9f0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
ca00: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
ca10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
ca20: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
ca30: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
ca40: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
ca50: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
ca60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ca70: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
ca80: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
ca90: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
caa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
cab0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
cac0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
cad0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
cae0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
caf0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
cb00: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
cb10: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
cb20: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
cb30: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
cb40: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
cb50: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
cb60: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
cb70: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
cb80: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
cb90: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
cba0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
cbb0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
cbc0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
cbd0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
cbe0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
cbf0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
cc00: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
cc10: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
cc20: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
cc30: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
cc40: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
cc50: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
cc60: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
cc70: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
cc80: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
cc90: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
cca0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
ccb0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
ccc0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
ccd0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
cce0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
ccf0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
cd00: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
cd10: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
cd20: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
cd30: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
cd40: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
cd50: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
cd60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
cd70: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
cd80: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
cd90: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
cda0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
cdb0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
cdc0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
cdd0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
cde0: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
cdf0: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
ce00: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
ce10: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
ce20: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
ce30: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
ce40: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
ce50: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
ce60: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
ce70: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
ce80: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
ce90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
cea0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
ceb0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
cec0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
ced0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cef0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
cf00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
cf10: 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
cf20: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
cf30: 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
cf40: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cf50: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cf60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
cf70: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
cf80: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
cf90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cfa0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cfb0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
cfc0: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfe0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cff0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
d000: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
d010: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
d020: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
d030: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
d040: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
d050: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
d060: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
d070: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
d080: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
d090: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
d0a0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
d0b0: 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
d0c0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
d0d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
d0e0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
d0f0: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
d100: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
d110: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
d120: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
d130: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
d140: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
d150: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
d160: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
d170: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
d180: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
d190: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d1a0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
d1b0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
d1d0: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
d1e0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
d1f0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
d200: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d210: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
d220: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
d230: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
d240: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d250: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d260: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
d270: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
d280: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
d290: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
d2a0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
d2b0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
d2c0: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
d2d0: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
d2e0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
d2f0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
d300: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
d310: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
d320: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
d330: 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
d340: 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
d350: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d360: 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
d370: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d380: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
d390: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
d3a0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
d3b0: 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
d3c0: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
d3d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
d3e0: 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
d3f0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d400: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
d410: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
d420: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
d430: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
d440: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
d450: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
d460: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
d470: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
d480: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
d490: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
d4a0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
d4b0: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
d4c0: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
d4d0: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
d4e0: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
d4f0: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
d500: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
d510: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
d520: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
d530: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
d540: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
d550: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
d560: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
d570: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
d580: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
d590: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
d5a0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d5b0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
d5c0: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d5d0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d5e0: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
d5f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d600: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
d610: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d620: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
d630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
d650: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d670: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
d680: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
d690: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
d6a0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
d6b0: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
d6c0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d6d0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d6e0: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
d6f0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
d700: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
d710: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
d720: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
d730: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
d740: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
d750: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
d760: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
d770: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
d780: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
d790: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
d7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d7b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
d7c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d7d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
d7e0: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
d7f0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d800: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
d810: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
d820: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
d830: 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
d840: 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
d850: 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
d860: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
d870: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
d880: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
d890: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
d8a0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
d8b0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
d8c0: 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
d8d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
d8e0: 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
d8f0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
d900: 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
d910: 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
d920: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d930: 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
d940: 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
d950: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
d960: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
d970: 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
d980: 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
d990: 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
d9a0: 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
d9b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
d9c0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
d9d0: 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
d9e0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
d9f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
da00: 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
da10: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
da20: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
da30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
da40: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
da50: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
da60: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
da70: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
da80: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
da90: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
daa0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
dab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
dac0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
dad0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
dae0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
daf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
db00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
db10: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
db20: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
db30: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
db40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
db50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
db60: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
db70: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
db80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
db90: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
dba0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
dbb0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
dbc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dbd0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
dbe0: 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
dbf0: 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  u++){.      rc =
dc00: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
dc10: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
dc20: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
dc30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dc40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
dc50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dc60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
dc70: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
dc80: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
dc90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
dca0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dcb0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dcc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dcd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dce0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
dcf0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
dd00: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
dd10: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70 72  e database is pr
dd20: 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20  obably.         
dd30: 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64   ** going to end
dd40: 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70   up being corrup
dd50: 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75 70  t.  It is corrup
dd60: 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e  t to us, anyhow.
dd70: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65  .          ** Pe
dd80: 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20 70  rhaps the next p
dd90: 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
dda0: 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e  long can fix it.
ddb0: 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ....          */
ddc0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ddd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dde0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
ddf0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
de00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
de10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
de20: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
de30: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
de40: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
de50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de60: 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
de70: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
de80: 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
de90: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
dea0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
deb0: 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
dec0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
ded0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
dee0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
def0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
df00: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
df10: 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
df20: 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66  ='\0');.  }.  if
df30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
df40: 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
df50: 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
df60: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
df70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
df80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
df90: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
dfa0: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
dfb0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
dfc0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
dfd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
dfe0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
dff0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
e000: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
e010: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
e020: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
e030: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
e040: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
e050: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
e060: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
e070: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
e080: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
e090: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
e0a0: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
e0b0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
e0c0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
e0d0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
e0e0: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
e0f0: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
e100: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e110: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
e120: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
e130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
e140: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
e150: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
e160: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
e170: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
e180: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
e190: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
e1a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e1b0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
e1c0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
e1d0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
e1e0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
e1f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
e200: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
e210: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
e220: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
e230: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
e240: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
e250: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
e260: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
e270: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
e280: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
e290: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
e2a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e2b0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
e2c0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
e2d0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
e2e0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
e2f0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
e300: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
e310: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
e320: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
e330: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e340: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
e350: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
e360: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
e390: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e3c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
e3d0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
e3e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
e3f0: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
e400: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
e410: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
e420: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
e430: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
e440: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
e450: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e460: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
e470: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
e480: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
e490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
e4a0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
e4b0: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
e4c0: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
e4d0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
e4e0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
e4f0: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
e500: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
e510: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
e520: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
e530: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
e540: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
e550: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
e560: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
e570: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
e580: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
e590: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
e5a0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
e5b0: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  tmtSize);.  asse
e5c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e5d0: 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
e5e0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
e5f0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
e600: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
e610: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e620: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
e630: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
e640: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
e650: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
e660: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
e670: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
e680: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
e690: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
e6a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e6b0: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
e6c0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e6d0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
e6e0: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
e6f0: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
e700: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
e710: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
e720: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
e730: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
e740: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
e750: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
e760: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
e770: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
e780: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f   i++){.    i64 o
e790: 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61  ffset = i*(4+pPa
e7a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e7b0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e7c0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e7d0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e7e0: 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30  >stfd, offset, 0
e7f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e800: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e810: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e820: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e830: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
e850: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
e860: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
e870: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e880: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
e890: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
e8a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
e8b0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
e8c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
e8d0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
e8e0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
e8f0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
e900: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
e910: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
e920: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
e930: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
e940: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
e950: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
e960: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
e970: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
e980: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
e990: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
e9a0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
e9b0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
e9c0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
e9d0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e9e0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ion..  */.  pPag
e9f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ea00: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
ea10: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
ea20: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
ea30: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
ea40: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
ea50: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
ea60: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
ea70: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
ea80: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
ea90: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
eaa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
eab0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
eac0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
ead0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
eae0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
eaf0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
eb00: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
eb10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
eb20: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
eb30: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
eb40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eb50: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
eb60: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
eb70: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
eb80: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
eb90: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
eba0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
ebb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ebc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
ebd0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
ebe0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
ebf0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
ec00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
ec10: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
ec20: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
ec30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ec40: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
ec50: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
ec60: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
ec70: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
ec80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ec90: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
eca0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ecb0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ecc0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
ecd0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
ece0: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
ecf0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ed00: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
ed10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ed20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ed30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ed40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
ed50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ed60: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
ed70: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
ed80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
ed90: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
eda0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
edb0: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
edc0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
edd0: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
ede0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
edf0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
ee00: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ee10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
ee20: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ee30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
ee40: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
ee50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ee60: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
ee70: 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
ee80: 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
ee90: 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
eea0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
eeb0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
eec0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
eed0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
eee0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
eef0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
ef00: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
ef10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
ef20: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
ef30: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
ef40: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
ef50: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
ef60: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
ef70: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
ef80: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
ef90: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
efa0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
efc0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
efd0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
efe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
eff0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
f000: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
f010: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
f020: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
f030: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
f040: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
f050: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
f060: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
f070: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
f080: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
f090: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
f0a0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
f0b0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
f0c0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
f0d0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
f0e0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
f0f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
f100: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
f110: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
f120: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
f130: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
f140: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f150: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
f160: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
f170: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
f180: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
f190: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
f1a0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
f1b0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
f1c0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
f1d0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
f1e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
f1f0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
f210: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f220: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
f230: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
f240: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
f250: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
f260: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
f270: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
f280: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
f290: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
f2a0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
f2b0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
f2c0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
f2d0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
f2e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
f2f0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
f300: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
f310: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
f320: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
f330: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
f340: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
f350: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
f360: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
f370: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
f380: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
f390: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
f3a0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
f3b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f3c0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
f3d0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
f3e0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
f3f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f400: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
f410: 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
f420: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
f430: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
f440: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
f450: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
f460: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
f470: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
f480: 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
f490: 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
f4a0: 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
f4b0: 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
f4c0: 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
f4d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
f4e0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f4f0: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
f500: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
f510: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
f520: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
f530: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
f540: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
f550: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
f560: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
f570: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
f580: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
f590: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
f5a0: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
f5b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f5c0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
f5d0: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
f5e0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
f5f0: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
f600: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
f610: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
f620: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
f630: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
f640: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
f650: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
f660: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
f670: 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
f680: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
f690: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
f6a0: 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68  orary.** file wh
f6b0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
f6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f6d0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
f6e0: 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
f6f0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
f700: 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
f710: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f720: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
f730: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
f740: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
f750: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
f770: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
f780: 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
f790: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
f7a0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f7b0: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
f7c0: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
f7d0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
f7e0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f7f0: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
f800: 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
f810: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f820: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
f830: 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
f840: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
f850: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
f860: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
f870: 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
f880: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
f890: 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
f8a0: 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
f8b0: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
f8c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
f8d0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
f8e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f8f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
f900: 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c  erStress(void *,
f910: 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  PgHdr *);../*.**
f920: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
f930: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
f940: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f950: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
f960: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
f970: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
f980: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
f990: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
f9a0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
f9b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
f9c0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
f9d0: 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
f9e0: 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
f9f0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
fa00: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
fa10: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
fa20: 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
fa30: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
fa40: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
fa50: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
fa60: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
fa70: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
fa80: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
fa90: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
faa0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
fab0: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
fac0: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
fad0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
fae0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
faf0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
fb00: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
fb10: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
fb20: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
fb30: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
fb40: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
fb50: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
fb60: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
fb70: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
fb80: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
fb90: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
fba0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
fbb0: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
fbc0: 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
fbd0: 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
fbe0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fbf0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
fc00: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
fc10: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
fc20: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
fc30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
fc40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
fc50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
fc60: 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
fc70: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
fc80: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
fc90: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
fca0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcc0: 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
fcd0: 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
fce0: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
fd00: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
fd10: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
fd20: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
fd30: 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
fd40: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
fd50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
fd60: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
fd70: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
fd80: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
fd90: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
fda0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
fdb0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
fdc0: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
fdd0: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
fde0: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
fdf0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
fe00: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
fe10: 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
fe20: 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63  leSize;.  int pc
fe30: 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
fe40: 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a  e3PcacheSize();.
fe50: 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74    int szPageDflt
fe60: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
fe70: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
fe80: 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
fe90: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   0;.  int nPathn
fea0: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
feb0: 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
fec0: 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
fed0: 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
fee0: 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
fef0: 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
ff00: 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
ff10: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
ff20: 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
ff30: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75   = sqlite3MemJou
ff40: 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a  rnalSize();.  }.
ff50: 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
ff60: 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55  t return is a NU
ff70: 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  LL pointer */.  
ff80: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
ff90: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
ffa0: 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
ffb0: 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
ffc0: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
ffd0: 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
ffe0: 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
fff0: 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
10000 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
10010 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
10020 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
10030 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
10040 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
10050 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
10060 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
10070 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
10080 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
10090 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
100a0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
100b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
100c0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
100d0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
100e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
100f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10100 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10110 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
10120 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
10130 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
10140 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
10150 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
10160 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
10170 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
10180 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
10190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
101a0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
101b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
101c0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
101d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
101e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
101f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10200 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
10210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
10230 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  thname = strlen(
10240 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
10250 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
10260 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
10270 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
10280 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
10290 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
102a0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
102b0 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
102c0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
102d0 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53  e */.    pcacheS
102e0 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20  ize      +      
102f0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
10300 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75  bject */.    jou
10310 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
10320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
10340 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
10350 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
10360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10370 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
10380 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
10390 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
103a0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
103b0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
103c0 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
103d0 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f   40            /
103e0 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
103f0 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
10400 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
10410 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
10420 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
10430 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
10440 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10450 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
10460 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 65  PCache = (PCache
10470 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
10480 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26   pPtr = ((u8 *)&
10490 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61  pPager[1]) + pca
104a0 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  cheSize;.  pPage
104b0 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
104c0 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
104d0 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
104e0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
104f0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
10500 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
10510 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
10520 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
10530 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile];.  pPager->
10540 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
10550 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
10560 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61  >szOsFile+journa
10570 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
10580 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
10590 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
105a0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a  Vfs->szOsFile+2*
105b0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
105c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
105d0 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
105e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
105f0 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
10600 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
10610 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
10620 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
10630 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
10640 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50  = pVfs;.  if( zP
10650 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
10660 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
10670 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
10680 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
10690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
106a0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
106b0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
106c0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
106d0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
106e0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
106f0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
10700 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
10710 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
10720 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a 65 6f  ame - (int)sizeo
10730 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  f("-journal")) )
10740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10750 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
10760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10770 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
10780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10790 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
107a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
107b0 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20  Pager->fd,.     
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46      pPager->vfsF
107e0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
107f0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
10800 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
10810 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
10820 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
10830 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
10840 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
10850 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
10860 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  .      ** choose
10870 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
10880 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
10890 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
108a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
108b0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
108c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
108d0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
108e0 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
108f0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
10900 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
10910 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20  IZE,.      **   
10920 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
10930 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
10940 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
10950 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
10960 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
10970 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
10980 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
10990 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
109a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
109b0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
109c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
109d0 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  iSectorSize = sq
109e0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
109f0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
10a00 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
10a10 65 44 66 6c 74 3c 69 53 65 63 74 6f 72 53 69 7a  eDflt<iSectorSiz
10a20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
10a30 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 53 65 63  zPageDflt = iSec
10a40 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
10a50 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
10a60 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
10a70 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
10a80 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
10a90 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
10aa0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
10ab0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
10ac0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
10ad0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
10ae0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
10af0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
10b00 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
10b10 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
10b20 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
10b30 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
10b40 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
10b50 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
10b60 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
10b70 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
10b80 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
10b90 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
10ba0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
10bb0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
10bc0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
10bd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
10be0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 73  MIC|(ii>>8)) ) s
10bf0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
10c00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10c10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10c20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
10c30 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  flt>SQLITE_MAX_D
10c40 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
10c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
10c60 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
10c70 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
10c80 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
10c90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10ca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10cb0 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
10cc0 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
10cd0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
10ce0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
10cf0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
10d00 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
10d10 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
10d20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
10d30 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
10d40 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
10d50 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10d60 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
10d70 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
10d80 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
10d90 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
10da0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
10db0 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
10dc0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10dd0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
10de0 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
10df0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
10e00 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
10e10 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
10e20 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
10e30 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
10e40 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
10e50 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
10e60 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10e70 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
10e80 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
10e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10ea0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
10eb0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10ec0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a 50 61  3PageMalloc(szPa
10ed0 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20  geDflt);.  }..  
10ee0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
10ef0 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
10f00 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
10f10 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
10f20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
10f30 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
10f40 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
10f50 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
10f60 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
10f70 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
10f80 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
10f90 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
10fa0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
10fb0 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
10fc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10fd0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
10fe0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
10ff0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
11000 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
11010 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
11020 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
11030 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
11040 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  .  nExtra = FORC
11050 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
11060 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
11070 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
11080 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
11090 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
110a0 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
110b0 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
110c0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
110d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
110e0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  ..  PAGERTRACE3(
110f0 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
11100 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
11110 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
11120 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
11130 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
11140 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
11150 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
11160 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  me))..  /* Fill 
11170 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  in Pager.zDirect
11180 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  ory[] */.  memcp
11190 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
111a0 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46  tory, pPager->zF
111b0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
111c0 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73  me+1);.  for(i=s
111d0 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44  trlen(pPager->zD
111e0 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26  irectory); i>0 &
111f0 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
11200 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
11210 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
11220 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
11230 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
11240 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
11250 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a  ger.zJournal[] *
11260 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
11270 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e ){.    memcpy(
11280 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
11290 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
112a0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
112b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
112c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
112d0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
112e0 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c 73  nal", 9);.  }els
112f0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  e{.    pPager->z
11300 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
11310 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a  ..  /* pPager->j
11320 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20  ournalOpen = 0; 
11330 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  */.  pPager->use
11340 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
11350 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
11360 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
11370 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
11380 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
11390 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
113a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
113b0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
113c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
113d0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
113e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
113f0 64 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  d = memDb;.  pPa
11400 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
11410 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a  szPageDflt;.  /*
11420 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
11430 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
11440 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
11450 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
11460 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
11470 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
11480 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50  Page = 100;.  pP
11490 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
114a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
114b0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
114c0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
114d0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
114e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
114f0 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
11500 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
11510 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
11520 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
11530 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
11540 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
11550 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
11560 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
11570 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
11580 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
11590 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
115a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
115b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
115c0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
115d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
115e0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
115f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
11600 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70  usiveMode = temp
11610 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
11620 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
11630 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
11640 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
11650 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
11660 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
11670 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
11680 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11690 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
116a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
116b0 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
116c0 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50  oSync?0:1);.  pP
116d0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
116e0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
116f0 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
11700 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
11710 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
11720 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
11730 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11740 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
11750 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
11760 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
11770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
11780 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
11790 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
117a0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
117b0 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
117c0 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d 70 46 69  pMethods||tempFi
117d0 6c 65 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  le);.  setSector
117e0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
117f0 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
11800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11810 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
11820 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
11830 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
11840 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
11850 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11860 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
11870 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Arg = 0; */.  /*
11880 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
11890 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
118a0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
118b0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
118c0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
118d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
118e0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
118f0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
11900 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
11910 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
11920 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
11930 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 6e  r *pPager, .  in
11940 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
11950 29 28 76 6f 69 64 20 2a 29 2c 0a 20 20 76 6f 69  )(void *),.  voi
11960 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
11970 72 67 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  rg.){  .  pPager
11980 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
11990 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
119a0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
119b0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
119c0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
119d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
119e0 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
119f0 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
11a00 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
11a10 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
11a20 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
11a30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
11a40 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
11a50 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
11a60 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
11a70 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11a80 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
11a90 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
11aa0 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
11ab0 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
11ac0 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
11ad0 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
11ae0 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
11af0 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
11b00 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
11b10 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
11b20 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
11b30 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
11b40 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
11b50 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
11b60 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
11b70 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
11b80 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f  the page size to
11b90 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20   *pPageSize. If 
11ba0 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
11bb0 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20  page size is.** 
11bc0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
11bd0 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
11be0 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
11bf0 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  set to that.** v
11c00 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
11c10 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
11c20 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11c30 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
11c40 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
11c50 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
11c60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11c70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
11c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
11c90 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
11ca0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
11cb0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
11cc0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
11cd0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11ce0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11cf0 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
11d00 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
11d10 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
11d20 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  geSize .     && 
11d30 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
11d40 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
11d50 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
11d60 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
11d70 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
11d80 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
11d90 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
11da0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
11db0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
11dc0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
11dd0 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
11de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11df0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
11e00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
11e10 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
11e20 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
11e30 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
11e40 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
11e50 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
11e60 62 20 29 20 73 65 74 53 65 63 74 6f 72 53 69 7a  b ) setSectorSiz
11e70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
11e80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
11e90 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
11ea0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
11eb0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
11ec0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
11ed0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
11ee0 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
11ef0 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
11f00 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
11f10 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
11f20 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
11f30 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eSize;.  }.  ret
11f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11f50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
11f60 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
11f70 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
11f80 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
11f90 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
11fa0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
11fb0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
11fc0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
11fd0 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
11fe0 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
11ff0 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
12000 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
12010 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
12020 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
12030 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
12040 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
12050 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
12060 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
12070 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
12080 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
12090 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
120a0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
120b0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
120c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
120d0 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
120e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
120f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
12100 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
12110 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
12120 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
12130 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
12140 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
12150 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
12160 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
12170 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
12180 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
12190 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
121a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
121b0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
121c0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
121d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
121e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
121f0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
12200 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
12210 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
12220 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
12230 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
12240 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
12250 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
12260 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
12270 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
12280 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  xPage;.  }.  sql
12290 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
122a0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nt(pPager, 0);. 
122b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
122c0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
122d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
122e0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
122f0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
12300 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
12310 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
12320 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
12330 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
12340 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
12350 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
12360 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
12370 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
12380 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
12390 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
123a0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
123b0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
123c0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
123d0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
123e0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
123f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
12400 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12410 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
12420 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
12430 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
12440 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
12450 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
12460 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
12470 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
12480 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
12490 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
124a0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
124b0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
124c0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
124d0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
124e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
124f0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
12500 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
12510 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
12520 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
12530 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12540 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
12550 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
12560 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12570 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12580 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
12590 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
125a0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
125b0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
125c0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
125d0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
125e0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
125f0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
12600 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
12610 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
12620 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
12630 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
12640 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
12650 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
12660 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
12670 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
12680 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
12690 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
126a0 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
126b0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
126c0 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
126d0 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
126e0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
126f0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
12700 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
12710 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
12720 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
12730 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
12740 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
12750 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
12760 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
12770 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
12780 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
12790 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
127a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
127b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
127c0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
127d0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
127e0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
127f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
12800 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12810 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
12820 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
12830 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
12840 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
12850 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
12860 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
12870 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
12880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12890 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
128a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
128b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
128c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
128d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
128e0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
128f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12900 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
12910 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
12920 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
12930 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
12940 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
12950 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
12960 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
12970 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
12980 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
12990 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
129a0 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
129b0 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
129c0 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
129d0 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
129e0 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
129f0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
12a00 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
12a10 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
12a20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
12a30 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
12a40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12a50 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
12a60 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
12a70 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20  .  i64 n = 0;.  
12a80 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
12a90 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
12aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12ab0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
12ac0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
12ae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
12af0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
12b00 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
12b10 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
12b20 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
12b30 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
12b40 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
12b50 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
12b60 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
12b70 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
12b80 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
12b90 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
12ba0 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
12bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
12bc0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
12bd0 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
12be0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12bf0 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
12c00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
12c10 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
12c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c30 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
12c40 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
12c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
12c60 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
12c70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12c80 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
12c90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
12ca0 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  zeValid = 1;.   
12cb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
12cc0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
12cd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
12ce0 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
12cf0 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
12d00 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
12d10 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e  ager->mxPgno = n
12d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61  ;.  }.  if( pnPa
12d30 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67  ge ){.    *pnPag
12d40 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  e = n;.  }.  ret
12d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12d60 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
12d70 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
12d80 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
12d90 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
12da0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12db0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
12dc0 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
12dd0 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
12de0 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64  .** is truncated
12df0 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65  .  Drop from the
12e00 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73   cache all pages
12e10 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a   whose pgno is.*
12e20 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  * larger than pP
12e30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
12e40 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
12e50 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
12e60 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
12e70 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
12e80 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
12e90 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  **.** Actually, 
12ea0 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69  at the point thi
12eb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12ec0 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65  led, it would be
12ed0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
12ee0 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  have a reference
12ef0 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74  d page.  But rat
12f00 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a  her than delete.
12f10 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64  ** that page and
12f20 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62   guarantee a sub
12f30 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74  sequent segfault
12f40 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65  , it seems bette
12f50 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20  r.** to zero it 
12f60 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65  and hope that we
12f70 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c   error out sanel
12f80 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
12f90 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
12fa0 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
12fb0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
12fc0 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
12fd0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
12fe0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
12ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
13000 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
13010 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
13020 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
13030 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
13040 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
13050 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
13060 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
13070 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
13080 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
13090 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
130a0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
130b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
130c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
130d0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
130e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
130f0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
13100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13110 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
13120 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
13130 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
13140 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
13150 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
13160 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
13170 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
13180 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
13190 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
131a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
131b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
131c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
131d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
131e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
131f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
13200 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
13210 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
13220 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
13230 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
13240 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
13250 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
13260 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
13270 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
13280 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
13290 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  alid==0 );..  if
132a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
132b0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
132c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
132d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
132e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
132f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
13300 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
13310 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
13320 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
13330 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
13340 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
13350 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
13360 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13380 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13390 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
133a0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
133b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
133c0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
133d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
133e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
133f0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
13400 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
13410 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
13420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13430 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
13440 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13450 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
13460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13480 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
13490 48 41 52 45 44 20 29 3b 0a 0a 20 20 73 71 6c 69  HARED );..  sqli
134a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
134b0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
134c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
134d0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
134e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
134f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
13500 67 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ge<pPager->dbSiz
13510 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79  e ){.    rc = sy
13520 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
13530 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13550 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
13560 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
13570 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
13580 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
13590 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
135a0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
135b0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
135c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
135d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
135e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
135f0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
13600 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
13610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13630 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
13640 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
13650 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
13660 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
13670 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
13680 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
13690 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
136a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
136b0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
136c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
136d0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
136e0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
136f0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
13700 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
13710 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
13720 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
13730 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
13740 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
13750 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
13760 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
13770 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
13780 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
13790 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
137a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
137b0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
137c0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
137d0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
137e0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
137f0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
13800 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
13810 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
13820 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
13830 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
13840 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
13850 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
13860 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
13870 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
13880 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
13890 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
138a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
138b0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
138c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
138d0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
138e0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
138f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13900 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13910 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
13920 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
13930 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
13940 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61  !MEMDB ){.    pa
13950 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
13960 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
13970 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  }.  enable_simul
13980 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
13990 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
139a0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
139b0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
139c0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
139d0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
139e0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
139f0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
13a00 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13a10 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
13a20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13a30 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
13a40 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
13a50 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
13a60 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71  InJournal);.  sq
13a70 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
13a80 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  oy(pPager->pAlwa
13a90 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 69  ysRollback);.  i
13aa0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
13ab0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
13ac0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13ad0 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
13ae0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13af0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
13b00 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
13b10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
13b20 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
13b30 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
13b40 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
13b50 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13b60 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
13b70 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
13b80 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  */..  sqlite3Pag
13b90 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
13ba0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
13bb0 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
13bc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
13bd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13be0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
13bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13c00 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
13c10 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
13c20 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
13c30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
13c40 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
13c50 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
13c60 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
13c70 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
13c80 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
13c90 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
13ca0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13cb0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
13cc0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
13cd0 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
13ce0 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
13cf0 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
13d00 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
13d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
13d20 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
13d30 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
13d40 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20  cacheRef(pPg);. 
13d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13d60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
13d70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13d80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
13d90 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
13da0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
13db0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
13dc0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
13dd0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
13de0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
13df0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
13e00 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
13e10 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
13e20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13e30 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
13e40 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
13e50 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
13e60 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
13e70 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
13e80 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
13e90 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
13ea0 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
13eb0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
13ec0 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
13ed0 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
13ee0 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
13ef0 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
13f00 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
13f10 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
13f20 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
13f30 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
13f40 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
13f50 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
13f60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
13f70 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
13f80 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
13f90 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
13fa0 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
13fb0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
13fc0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
13fd0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
13fe0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13ff0 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
14000 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
14010 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
14020 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
14030 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
14040 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
14050 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
14060 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
14070 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
14080 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
14090 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
140a0 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
140b0 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
140c0 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
140d0 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
140e0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
140f0 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  no sync occurs..
14100 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43  **.** If the IOC
14110 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c  AP_SEQUENTIAL fl
14120 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74 68  ag is set for th
14130 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
14140 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74  ia on which.** t
14150 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
14160 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79  tored, then OsSy
14170 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
14180 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  lled on the jour
14190 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20  nal.** file. In 
141a0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68  this case all th
141b0 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
141c0 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
141d0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a  nRec field in.**
141e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
141f0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  der..**.** This 
14200 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
14210 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
14220 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
14230 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
14240 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
14250 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
14260 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
14270 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
14280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
14290 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
142a0 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
142b0 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
142c0 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
142d0 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
142e0 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
142f0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
14300 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
14310 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
14320 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14330 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
14340 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
14350 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
14360 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14370 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
14380 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
14390 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
143a0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
143b0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
143c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
143d0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
143e0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
143f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
14400 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
14410 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
14420 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
14430 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
14440 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
14450 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
14460 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
14470 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
14480 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
14490 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
144a0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
144b0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
144c0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
144d0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
144e0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
144f0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
14500 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
14510 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
14520 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
14530 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
14540 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
14550 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
14560 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
14570 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
14580 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
14590 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
145a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
145b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
145c0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
145d0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
145e0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
145f0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
14600 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
14610 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
14620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
14630 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
14640 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
14650 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
14660 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
14670 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
14680 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20  jrnlOff;.       
14690 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
146a0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
146b0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
146c0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
146d0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
146e0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
146f0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
14700 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
14710 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
14720 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
14730 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
14740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
14750 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
14760 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
14770 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
14780 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
14790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
147a0 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66  ..        jrnlOf
147b0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
147c0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
147d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
147e0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
147f0 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
14800 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72  d\n", pPager, jr
14810 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20  nlOff, 4));.    
14820 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
14830 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
14840 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65  , jrnlOff, pPage
14850 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
14860 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14870 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
14880 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
14890 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
148a0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
148b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
148c0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
148d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
148e0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
148f0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
14900 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
14910 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
14920 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
14930 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
14940 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20  ->sync_flags| . 
14950 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
14960 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
14970 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
14980 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
14990 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
149a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
149b0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
149c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
149d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
149e0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
149f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
14a00 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
14a10 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
14a20 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
14a30 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
14a40 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  */.    sqlite3Pc
14a50 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
14a60 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
14a70 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  he);.  }..  retu
14a80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14a90 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
14aa0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
14ab0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
14ac0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
14ad0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
14ae0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
14af0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
14b00 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c  ase file. No cal
14b10 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74  ls are made.** t
14b20 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
14b30 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
14b40 65 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20  es as clean. It 
14b50 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
14b60 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20  ility.** of the 
14b70 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63  caller to use Pc
14b80 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f  acheCleanAll() o
14b90 72 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  r PcacheMakeClea
14ba0 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74  n() to mark.** t
14bb0 68 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61  he pages as clea
14bc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
14bd0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
14be0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
14bf0 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
14c00 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14c10 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14c20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14c30 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14c40 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
14c50 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
14c60 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
14c70 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
14c80 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
14c90 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
14ca0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
14cb0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
14cc0 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
14cd0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
14ce0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
14cf0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
14d00 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14d10 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14d20 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14d30 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14d40 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
14d50 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
14d60 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
14d70 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
14d80 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
14d90 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
14da0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
14db0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
14dc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14dd0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
14de0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
14df0 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
14e00 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14e10 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14e20 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14e30 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14e40 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14e50 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
14e60 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
14e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
14e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14e90 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
14ea0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
14eb0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
14ec0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
14ed0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
14ee0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
14ef0 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
14f00 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14f10 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14f20 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14f30 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14f40 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14f50 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
14f60 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
14f70 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
14f80 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
14f90 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
14fa0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
14fb0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
14fc0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
14fd0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
14fe0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
14ff0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
15000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15020 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
15030 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
15040 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
15050 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
15060 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
15070 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
15080 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
15090 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
150a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
150b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
150c0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
150d0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
150e0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
150f0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
15100 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15120 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
15130 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
15140 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
15150 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
15160 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
15170 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15180 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
15190 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
151a0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
151b0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
151c0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
151d0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
151e0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
151f0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
15200 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
15210 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
15220 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
15230 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
15240 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
15250 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
15260 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
15270 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
15280 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
15290 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
152a0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
152b0 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
152c0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
152d0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73  ist->pData, pLis
152e0 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
152f0 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
15300 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
15310 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
15340 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
15350 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
15360 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49  pList));.      I
15370 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
15380 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
15390 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
153a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
153b0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
153c0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
153d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
153e0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41  ffset);.      PA
153f0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
15400 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
15410 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
15420 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
15430 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
15440 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
15450 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
15460 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
15470 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
15480 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
15490 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
154a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
154b0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
154c0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
154d0 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
154e0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
154f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
15500 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
15510 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15520 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
15530 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
15540 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
15550 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
15560 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
15570 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
15580 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
15590 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
155a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
155b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
155c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
155d0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
155e0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
155f0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
15600 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
15610 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
15620 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
15630 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67  ointer to a purg
15640 65 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20  eable Pager .** 
15650 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e  object. This fun
15660 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
15670 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20  o make a single 
15680 64 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20  dirty page that 
15690 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61  has no.** outsta
156a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
156b0 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
156c0 20 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69   clean so that i
156d0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
156e0 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61  d .** by the pca
156f0 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  che layer..*/.st
15700 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
15710 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
15720 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
15730 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
15740 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
15750 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
15770 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  NotSync ){.    r
15780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15790 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
157a0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
157b0 5f 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20  _DIRTY );.  if( 
157c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
157d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157e0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
157f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
15800 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
15810 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
15820 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
15830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15840 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
15850 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50  && .        !(pP
15860 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
15870 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
15880 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
15890 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65          !(sqlite
158a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
158b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
158c0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
158d0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
158e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
158f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
15900 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
15910 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
15920 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
15930 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
15940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15950 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
15960 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
15970 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
15980 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
15990 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
159a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
159b0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
159c0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
159d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
159e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
159f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
15a00 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
15a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
15a30 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
15a40 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
15a50 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
15a60 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
15a70 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
15a80 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
15a90 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
15aa0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
15ab0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15ac0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
15ad0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
15ae0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
15af0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
15b00 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
15b10 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
15b20 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
15b30 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
15b40 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
15b50 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ournal..**.** Re
15b60 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
15b70 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72   unable to deter
15b80 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20  mine the status 
15b90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
15ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15bb0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e  ne does not open
15bc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15bd0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73  e to examine its
15be0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65  .** content.  He
15bf0 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nce, the journal
15c00 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74   might contain t
15c10 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
15c20 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
15c30 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
15c40 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68  n deleted, and h
15c50 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e  ence not be hot.
15c60 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64    Or.** the head
15c70 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
15c80 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65  l might be zeroe
15c90 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75  d out.  This rou
15ca0 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  tine.** does not
15cb0 20 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20   discover these 
15cc0 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68  cases of a non-h
15cd0 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20  ot journal - if 
15ce0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
15cf0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
15d00 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73  s not empty this
15d10 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
15d20 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20   it.** is hot.  
15d30 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
15d40 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
15d50 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
15d60 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
15d70 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
15d80 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e  y hot and will n
15d90 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
15da0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
15db0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
15dc0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
15dd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
15de0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
15df0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
15e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15e10 65 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 6c 6f  exists;.  int lo
15e20 63 6b 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  cked;.  assert( 
15e30 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
15e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
15e50 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
15e60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
15e70 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
15e80 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
15e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
15ea0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
15eb0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
15ec0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
15ed0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
15ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15ef0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
15f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15f10 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
15f20 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
15f30 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20 69  locked);.  }.  i
15f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15f50 20 26 26 20 65 78 69 73 74 73 20 26 26 20 21 6c   && exists && !l
15f60 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  ocked ){.    int
15f70 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d   nPage;.    rc =
15f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
15f90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
15fa0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
15fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15fc0 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  .     if( nPage=
15fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15fe0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
15ff0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
16000 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
16010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
16020 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
16030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16050 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
16060 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
16070 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
16080 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
16090 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
160a0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
160b0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
160c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
160d0 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
160e0 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
160f0 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
16100 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
16110 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
16120 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
16130 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
16140 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
16150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16160 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
16170 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
16180 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16190 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
161a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
161b0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
161c0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65  Pg->pData, pPage
161d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
161e0 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
161f0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16200 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
16210 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
16220 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
16230 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
16240 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16250 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
16260 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
16270 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
16280 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
16290 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 2c  pPg->pData)[24],
162a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
162d0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
162e0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
162f0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
16300 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
16310 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
16320 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
16330 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
16340 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
16350 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
16360 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
16370 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
16380 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
16390 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
163a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
163b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
163c0 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
163d0 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
163e0 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
163f0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
16400 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16410 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
16420 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
16430 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
16440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
16450 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
16460 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
16470 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
16480 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
16490 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
164a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
164b0 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
164c0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
164d0 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
164e0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
164f0 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
16500 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
16510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16520 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
16530 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
16540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16550 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  K;.  int isError
16560 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Reset = 0;..  /*
16570 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
16580 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20  e is opened for 
16590 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
165a0 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  , has no outstan
165b0 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20  ding .  ** page 
165c0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69  references and i
165d0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
165e0 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20  ate, now is the 
165f0 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a  chance to clear.
16600 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20    ** the error. 
16610 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
16620 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
16630 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61  r-cache and trea
16640 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20  t any.  ** open 
16650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20  journal file as 
16660 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  a hot-journal.. 
16670 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42   */.  if( !MEMDB
16680 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   && pPager->excl
16690 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
166a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
166b0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
166c0 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50  PCache)==0 && pP
166d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20  ager->errCode . 
166e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
166f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
16700 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
16710 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
16720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
16730 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
16740 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
16750 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
16760 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
16770 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e  r is still in an
16780 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
16790 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68   not proceed. Th
167a0 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74  e error .  ** st
167b0 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ate will be clea
167c0 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  red at some poin
167d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
167e0 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20  when all page . 
167f0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61   ** references a
16800 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74  re dropped and t
16810 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  he cache can be 
16820 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a  discarded..  */.
16830 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16840 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
16850 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
16860 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
16870 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
16880 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ode;.  }..  if( 
16890 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
168a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
168b0 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
168c0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
168d0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
168e0 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48  Vfs;.    int isH
168f0 6f 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 61  otJournal;.    a
16900 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
16910 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
16920 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
16930 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
16940 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
16950 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16960 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
16970 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16980 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
16990 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
169a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
169b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
169c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
169d0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
169e0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
169f0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16a00 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
16a20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
16a30 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
16a40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
16a50 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
16a60 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
16a70 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
16a80 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
16a90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16aa0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
16ab0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
16ac0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
16ad0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
16ae0 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
16af0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72  Reset ){.      r
16b00 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
16b10 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
16b20 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
16b30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16b40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
16b50 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
16b60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16b70 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
16b80 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
16b90 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
16ba0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16bb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16bc0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
16bd0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
16be0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
16bf0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16c00 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
16c10 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
16c20 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
16c30 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16c40 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16c50 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16c60 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
16c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16c80 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16c90 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16ca0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16cb0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
16cc0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
16cd0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
16ce0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
16cf0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 2a  ling it .      *
16d00 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  * back..      **
16d10 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
16d20 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
16d30 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
16d40 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
16d50 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ed, the.      **
16d60 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
16d70 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
16d80 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
16d90 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
16da0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
16db0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
16dc0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16dd0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
16de0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16df0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
16e00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
16e10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e20 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
16e30 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
16e40 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
16e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
16e70 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
16e80 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
16e90 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
16ea0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
16eb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16ec0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
16ed0 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
16ee0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
16ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
16f00 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
16f10 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
16f20 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
16f30 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
16f40 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
16f50 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
16f60 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
16f70 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
16f80 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
16f90 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
16fa0 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
16fb0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
16fc0 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
16fd0 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
16fe0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
16ff0 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
17000 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
17010 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
17020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17030 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
17040 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
17050 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
17060 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
17070 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17080 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
17090 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  ,pPager->zJourna
170a0 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  l,SQLITE_ACCESS_
170b0 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20  EXISTS,&res);.  
170c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
170d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
170e0 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
170f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
17100 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
17110 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
17120 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17130 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
17140 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
17150 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17160 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
17170 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
17180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17190 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
171a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
171b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
171c0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
171d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
171e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
171f0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
17200 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17220 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
17230 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
17240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17250 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
17260 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
17270 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
17280 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
17290 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
172a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
172b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
172c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
172d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
172e0 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74  at means some ot
172f0 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
17300 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
17310 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74  lready rolled it
17320 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   back */.       
17330 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17340 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
17350 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17360 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
17370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17380 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
17390 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
173a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
173b0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
173c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
173d0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
173e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
173f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
17400 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
17410 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
17420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17430 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
17440 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
17450 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
17460 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
17470 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
17480 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
17490 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
174a0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
174b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
174c0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
174d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
174e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
174f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
17500 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
17510 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
17520 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
17530 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
17540 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
17550 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
17560 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
17570 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17580 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
17590 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
175a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
175b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
175c0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
175d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
175e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
175f0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
17600 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
17610 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
17620 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
17630 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
17640 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
17650 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
17660 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
17670 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
17680 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17690 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
176a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
176b0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
176c0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
176d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
176e0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
176f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
17700 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
17710 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
17720 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
17730 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
17740 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
17750 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
17760 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
17770 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
17780 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
17790 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
177a0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
177b0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
177c0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
177d0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
177e0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
177f0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
17800 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
17810 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
17820 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
17830 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
17840 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
17850 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
17860 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
17870 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
17880 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
17890 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
178a0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
178b0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
178c0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
178d0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
178e0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
178f0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
17900 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
17910 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
17920 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
17930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
17940 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17950 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  ager, 0);..     
17960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
17970 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
17980 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
17990 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Code;.        go
179a0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
179b0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
179c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
179d0 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 69  Valid );.      i
179e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
179f0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
17a00 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
17a10 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17a20 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17a30 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
17a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17a50 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
17a60 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
17a70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
17a80 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
17a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
17ab0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
17ac0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
17ad0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
17ae0 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
17af0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
17b00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
17b10 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
17b20 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
17b30 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
17b40 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
17b50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
17b60 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17b70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
17b80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
17b90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
17ba0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
17bb0 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52  tate<=PAGER_SHAR
17bc0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
17bd0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
17be0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
17bf0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17c00 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
17c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69  .    }.  }.. fai
17c20 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
17c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17c40 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  /* pager_unlock(
17c50 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
17c60 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
17c70 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
17c80 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
17c90 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
17ca0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
17cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17cc0 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
17cd0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  e the content fo
17ce0 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68  r a page.  If th
17cf0 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72  e page was.** pr
17d00 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
17d10 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
17d20 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ==1, then the co
17d30 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73  ntent was.** jus
17d40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  t initialized to
17d50 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f   zeros instead o
17d60 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
17d70 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e  m disk..** But n
17d80 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65 20 72  ow we need the r
17d90 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20  eal data off of 
17da0 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73  disk.  So make s
17db0 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69  ure we.** have i
17dc0 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20 69  t.  Read it in i
17dd0 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  f we do not have
17de0 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a   it already..*/.
17df0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17e00 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48  _get_content(PgH
17e10 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
17e20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
17e30 5f 4e 45 45 44 5f 52 45 41 44 20 29 7b 0a 20 20  _NEED_READ ){.  
17e40 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44    int rc = readD
17e50 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65  bPage(pPg->pPage
17e60 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e  r, pPg, pPg->pgn
17e70 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
17e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e90 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17ea0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17eb0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
17ec0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17ed0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17ef0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
17f00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
17f10 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 61   reached zero, a
17f20 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
17f30 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69  not in the.** mi
17f40 64 64 6c 65 20 6f 66 20 61 20 77 72 69 74 65 20  ddle of a write 
17f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f  transaction or o
17f60 70 65 6e 65 64 20 69 6e 20 65 78 63 6c 75 73 69  pened in exclusi
17f70 76 65 20 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20  ve mode, unlock 
17f80 69 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  it..*/ .static v
17f90 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
17fa0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
17fb0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
17fc0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
17fd0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
17fe0 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 20 26 26  ache)==0).    &&
17ff0 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
18000 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
18010 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
18020 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
18030 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
18040 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
18050 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20  }../*.** Drop a 
18060 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61  page from the ca
18070 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  che using sqlite
18080 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a  3PcacheDrop()..*
18090 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61  *.** If this mea
180a0 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77  ns there are now
180b0 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72   no pages with r
180c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
180d0 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  m, a rollback.**
180e0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
180f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18100 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e  base is removed.
18110 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18120 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62  pagerDropPage(Db
18130 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
18140 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
18150 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c  g->pPager;.  sql
18160 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
18170 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  Pg);.  pagerUnlo
18180 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
18190 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  r);.}../*.** Acq
181a0 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
181b0 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
181c0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
181d0 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
181e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
181f0 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
18200 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
18210 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
18220 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
18230 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
18240 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
18250 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
18260 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
18270 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
18280 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
18290 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
182a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
182b0 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
182c0 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
182d0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
182e0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
182f0 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
18300 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
18310 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
18320 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
18330 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
18340 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
18350 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
18360 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
18370 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
18380 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
18390 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
183a0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
183b0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
183c0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
183d0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
183e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
183f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
18400 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
18410 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
18420 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
18430 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
18440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
18450 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
18460 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
18470 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
18480 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
18490 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
184a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
184b0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
184c0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
184d0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
184e0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
184f0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
18500 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
18510 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
18520 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
18530 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
18540 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
18550 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
18560 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
18570 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
18580 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
18590 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
185a0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
185b0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
185c0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
185d0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
185e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  s..**.** If noCo
185f0 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ntent is false, 
18600 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
18610 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72  s are actually r
18620 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
18630 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
18640 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
18650 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
18660 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
18670 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
18680 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
18690 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64  ime, so do not d
186a0 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20  o a disk read.  
186b0 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
186c0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  .** page content
186d0 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75   with zeros.  Bu
186e0 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20  t mark the fact 
186f0 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74  that we have not
18700 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e   read the.** con
18710 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20  tent by setting 
18720 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
18730 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20  ad flag.  Later 
18740 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74  on, if .** sqlit
18750 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
18760 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  s called on this
18770 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69 73   page or if this
18780 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63   routine is.** c
18790 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68  alled again with
187a0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74   noContent==0, t
187b0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
187c0 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65  he content is ne
187d0 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eded.** and the 
187e0 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64  disk read should
187f0 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
18800 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
18810 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
18820 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
18830 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
18840 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
18850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
18860 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
18870 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
18880 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
18890 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
188a0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
188b0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
188c0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
188d0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
188e0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
188f0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
18900 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
18910 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
18920 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
18930 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18940 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18950 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
18960 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  K .       || sql
18970 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
18980 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
18990 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c  he)>0 .       ||
189a0 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20   pgno==1.  );.. 
189b0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
189c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
189d0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
189e0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
189f0 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
18a00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
18a10 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
18a20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
18a30 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
18a40 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
18a50 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
18a60 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
18a70 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
18a80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18a90 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
18aa0 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
18ab0 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
18ac0 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
18ad0 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
18ae0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
18af0 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f  ppPage = 0;..  /
18b00 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
18b10 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
18b20 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
18b30 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
18b40 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
18b50 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
18b60 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
18b70 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
18b80 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
18b90 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
18ba0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
18bb0 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
18bc0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
18bd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18be0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
18bf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18c00 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
18c10 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  OCK );..  rc = s
18c20 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
18c30 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
18c40 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67  e, pgno, 1, &pPg
18c50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18c70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
18c80 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  f( pPg->pPager==
18c90 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
18ca0 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
18cb0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
18cc0 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
18cd0 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
18ce0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
18cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
18d00 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f  nMax;.    PAGER_
18d10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
18d20 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  ss);.    pPg->pP
18d30 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
18d40 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
18d50 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72  Extra, 0, pPager
18d60 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a 20 20 20 20  ->nExtra);..    
18d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18d80 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
18d90 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69  r, &nMax);.    i
18da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18db0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18dc0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
18dd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18de0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
18df0 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
18e00 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43   || MEMDB || noC
18e10 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
18e20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
18e30 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
18e40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
18e50 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
18e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18e70 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
18e80 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
18e90 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
18ea0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18eb0 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
18ec0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  t ){.        pPg
18ed0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
18ee0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
18ef0 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43    }.      IOTRAC
18f00 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
18f10 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
18f20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18f30 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
18f40 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
18f50 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
18f60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18f70 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
18f80 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
18f90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  {.        /* sql
18fa0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
18fb0 50 67 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  Pg); */.        
18fc0 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 70 50  pagerDropPage(pP
18fd0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
18fe0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18ff0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
19000 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
19010 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
19020 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
19030 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
19040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
19050 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
19060 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
19070 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
19080 73 73 65 72 74 28 73 71 6c 69 74 65 33 50 63 61  ssert(sqlite3Pca
19090 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
190a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
190b0 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20  | pgno==1);.    
190c0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
190d0 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66  r->nHit);.    if
190e0 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  ( !noContent ){.
190f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
19100 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
19110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
19120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19130 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
19140 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19150 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61    }.  }..  *ppPa
19170 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
19180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19190 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
191a0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
191b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
191c0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
191d0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
191e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
191f0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
19200 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
19210 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
19220 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
19230 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
19240 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
19250 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
19260 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
19270 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
19280 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
19290 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
192a0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
192b0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
192c0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
192d0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
192e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
192f0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
19300 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
19310 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
19320 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
19330 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
19340 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
19350 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
19360 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
19370 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
19380 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19390 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
193a0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
193b0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
193c0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
193d0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50  =0 );..  if( (pP
193e0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
193f0 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26  ER_UNLOCK).   &&
19400 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
19410 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
19420 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
19430 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20  =SQLITE_FULL).  
19440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
19450 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
19460 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
19470 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a   0, &pPg);.  }..
19480 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
19490 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
194a0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
194b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
194c0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
194d0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
194e0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
194f0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
19500 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
19510 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
19520 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
19530 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
19540 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
19550 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
19560 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19570 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
19580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19590 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
195a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
195b0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
195c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
195d0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
195e0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
195f0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
19600 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
19610 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19630 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
19640 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
19650 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
19660 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
19670 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
19680 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
19690 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
196a0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
196b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
196c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
196d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
196e0 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
196f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
19700 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
19710 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
19720 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
19730 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19740 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
19750 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
19760 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
19770 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19780 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
19790 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
197a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
197b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
197c0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
197d0 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
197e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
197f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19800 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
19810 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19820 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
19830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19840 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
19850 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
19860 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
19870 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
19880 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
19890 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
198a0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
198b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
198c0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
198d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
198e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
198f0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
19900 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
19910 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
19920 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
19930 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
19940 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
19950 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
19960 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
19970 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
19980 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
19990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
199a0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
199b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
199c0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
199d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
199e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
199f0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
19a00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19a10 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
19a20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
19a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19a40 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  OK;.    }else{.#
19a50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19a60 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
19a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19a80 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
19a90 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
19aa0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19ab0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
19ac0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
19ad0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
19ae0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
19af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19b00 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
19b10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
19b20 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
19b30 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
19b40 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
19b50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
19b60 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
19b70 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67  hods );.    pPag
19b80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
19b90 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19ba0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
19bb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19bc0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69  alHdr = 0;.    i
19bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19be0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
19bf0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
19c00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19c10 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19c20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19c30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19c40 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
19c50 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
19c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
19c70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19c80 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
19c90 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
19ca0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
19cb0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
19cc0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
19cd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
19ce0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
19cf0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
19d00 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
19d10 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19d20 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
19d30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
19d40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
19d50 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
19d60 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
19d70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19d80 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
19d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19da0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19db0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
19dc0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
19dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19de0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
19df0 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54  MEM && rc!=SQLIT
19e00 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
19e10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
19e20 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
19e30 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
19e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19e60 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
19e70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19e80 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
19e90 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
19ea0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
19eb0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
19ec0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
19ed0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
19ee0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
19ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
19f00 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
19f10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19f20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
19f30 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
19f40 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
19f50 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
19f60 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
19f70 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
19f80 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  wo() is called..
19f90 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
19fa0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69  agerRollback() i
19fb0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
19fc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
19fd0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
19fe0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
19ff0 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1a000 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
1a010 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
1a020 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1a030 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
1a040 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1a050 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1a060 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
1a070 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1a080 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
1a090 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
1a0a0 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
1a0b0 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
1a0c0 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
1a0d0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1a0e0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
1a0f0 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
1a100 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
1a110 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1a120 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1a130 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
1a140 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1a150 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1a160 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
1a170 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
1a180 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a190 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
1a1a0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1a1b0 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
1a1c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
1a1d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1a1e0 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
1a1f0 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1a200 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
1a210 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
1a220 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
1a230 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a240 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
1a250 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
1a260 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
1a270 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1a280 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
1a290 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1a2a0 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
1a2b0 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
1a2c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1a2d0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
1a2e0 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
1a2f0 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
1a300 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1a310 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
1a320 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
1a330 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
1a340 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
1a350 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
1a360 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
1a370 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
1a380 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
1a390 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
1a3a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1a3b0 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70  rBegin(DbPage *p
1a3c0 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  Pg, int exFlag){
1a3d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1a3e0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1a3f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a400 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1a410 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1a420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a430 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1a440 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
1a450 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1a460 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
1a470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a480 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1a490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
1a4a0 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  EMDB );.    rc =
1a4b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1a4c0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1a4d0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  VED_LOCK);.    i
1a4e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a4f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a500 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1a510 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
1a520 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
1a530 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a540 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1a550 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1a560 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
1a570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1a580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a590 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a5a0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1a5b0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
1a5c0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
1a5d0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
1a5e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1a5f0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ger));.    if( p
1a600 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1a610 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
1a620 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20  mpFile.         
1a630 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1a640 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1a650 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1a660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1a670 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1a680 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1a690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1a6a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a6b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1a6c0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
1a6d0 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
1a6e0 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
1a6f0 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
1a700 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1a710 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
1a720 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
1a730 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
1a740 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1a750 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
1a760 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
1a770 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
1a780 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
1a790 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
1a7a0 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
1a7b0 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
1a7c0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
1a7d0 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
1a7e0 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
1a7f0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
1a800 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
1a810 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a820 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
1a830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a840 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
1a850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a860 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1a870 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  l==0 );.    sqli
1a880 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1a890 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
1a8a0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
1a8b0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
1a8c0 74 76 65 63 43 72 65 61 74 65 28 20 70 50 61 67  tvecCreate( pPag
1a8d0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20  er->dbSize );.  
1a8e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70    if( !pPager->p
1a8f0 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  InJournal ){.   
1a900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a910 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1a920 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1a930 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1a940 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a950 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1a960 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1a970 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1a980 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  rt( !pPager->jou
1a990 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1a9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1a9b0 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1a9c0 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
1a9d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
1a9e0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1a9f0 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1aa00 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1aa10 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1aa20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1aa30 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1aa40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1aa50 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1aa60 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1aa70 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1aa80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1aa90 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1aaa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1aab0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1aac0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1aad0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1aae0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1aaf0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1ab00 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1ab10 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1ab20 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1ab30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ab40 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1ab50 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1ab60 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1ab70 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1ab80 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1ab90 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1aba0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1abb0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1abc0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1abd0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1abe0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1abf0 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1ac00 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1ac10 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1ac20 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1ac30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ac40 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1ac50 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1ac60 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1ac70 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1ac80 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1ac90 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1aca0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1acb0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1acc0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1acd0 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1ace0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1acf0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1ad00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ad10 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1ad20 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1ad30 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
1ad40 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ta;.  Pager *pPa
1ad50 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ad60 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1ad70 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
1ad80 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
1ad90 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1ada0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
1adb0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1adc0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1add0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
1ade0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
1adf0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
1ae00 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1ae10 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1ae20 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
1ae30 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1ae40 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73  If this page was
1ae50 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1ae60 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1ae70 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61  ent==1, that mea
1ae80 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27  ns.  ** we didn'
1ae90 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e  t really read in
1aea0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1aeb0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
1aec0 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20  can happen.  ** 
1aed0 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68  (for example) wh
1aee0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
1aef0 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
1af00 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74  e freelist.  But
1af10 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65  .  ** now we are
1af20 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e   (perhaps) movin
1af30 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f  g the page off o
1af40 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66  f the freelist f
1af50 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e  or.  ** reuse an
1af60 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  d we need to kno
1af70 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  w its original c
1af80 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63  ontent so that c
1af90 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20  ontent.  ** can 
1afa0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
1afb0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1afc0 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65  l.  So do the re
1afd0 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ad at this.  ** 
1afe0 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  time..  */.  rc 
1aff0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1b000 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
1b010 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1b020 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   rc;.  }..  /* M
1b030 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1b040 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
1b050 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
1b060 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
1b070 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
1b080 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
1b090 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
1b0a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
1b0b0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
1b0c0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
1b0d0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
1b0e0 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
1b0f0 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
1b100 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
1b110 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1b120 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1b130 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
1b140 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
1b150 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
1b160 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
1b170 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1b180 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1b190 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
1b1a0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
1b1b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
1b1c0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
1b1d0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
1b1e0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
1b1f0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
1b200 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
1b210 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b220 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
1b230 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
1b240 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1b250 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b260 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b270 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1b280 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b290 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
1b2a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1b2b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b2c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b2d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b2e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b2f0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1b300 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1b310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1b320 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
1b330 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
1b340 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1b350 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1b360 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
1b370 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1b380 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1b390 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b3a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b3b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b3c0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
1b3d0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1b3e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
1b3f0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
1b400 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1b410 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
1b420 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
1b430 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
1b440 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
1b450 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1b460 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1b470 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
1b480 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1b490 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
1b4a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1b4b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1b4c0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1b4d0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
1b4e0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
1b4f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1b500 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
1b510 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
1b520 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1b530 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
1b540 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
1b550 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
1b560 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1b570 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1b580 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b590 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1b5a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
1b5b0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1b5c0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1b5d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1b5e0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1b5f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1b600 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
1b610 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
1b620 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1b630 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1b640 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
1b650 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1b660 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
1b670 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
1b680 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
1b690 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
1b6a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1b6b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1b6c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1b6d0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
1b6e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1b6f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b710 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1b720 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1b730 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1b740 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b770 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b  journalOff + 4);
1b780 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1b790 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1b7a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b7b0 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e+4;.        }. 
1b7c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b7f0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1b800 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1b810 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
1b820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
1b840 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
1b850 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b860 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1b870 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1b880 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
1b890 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b8a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1b8b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1b8c0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1b8d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1b8e0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1b8f0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1b900 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20  TRACE5("JOURNAL 
1b910 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1b920 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
1b930 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1b940 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1b950 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1b970 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1b980 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
1b990 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1b9a0 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  pPg));..        
1b9b0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1b9c0 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1b9d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1b9e0 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1b9f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ba00 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
1ba10 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
1ba20 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
1ba30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1ba40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ba50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ba60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1ba70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1ba80 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1ba90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1baa0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
1bab0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bac0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
1bad0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
1bae0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1baf0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1bb00 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
1bb10 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1bb20 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
1bb30 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
1bb40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1bb50 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1bb60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1bb70 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
1bb80 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70  >pInStmt, pPg->p
1bb90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gno);.        }.
1bba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bbb0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1bbc0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1bbd0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1bbe0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1bbf0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1bc00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1bc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bc20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
1bc30 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1bc40 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1bc70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
1bc90 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1bca0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 3b  EED_SYNC)?1:0));
1bcb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bcc0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
1bcd0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1bce0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bcf0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1bd00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1bd10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1bd20 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1bd30 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1bd40 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1bd50 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1bd60 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1bd70 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1bd80 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1bd90 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1bda0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1bdb0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1bdc0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1bdd0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1bde0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1bdf0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1be00 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1be10 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1be20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1be30 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
1be40 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53       && !pageInS
1be50 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
1be60 20 20 20 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f      && pPg->pgno
1be70 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1be80 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
1be90 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
1bea0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28  ager->stmtNRec*(
1beb0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
1bec0 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
1bed0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
1bee0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1bef0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1bf00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67       assert( pag
1bf10 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1bf20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1bf30 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1bf40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
1bf50 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1bf60 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->stfd, offset, 
1bf70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1bf80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1bfa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1bfb0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1bfc0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1bfd0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1bfe0 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
1bff0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1c000 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1c010 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c020 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c030 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1c040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1c060 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1c070 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1c080 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
1c090 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c0a0 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  pInStmt!=0 );.  
1c0b0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
1c0c0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1c0d0 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
1c0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c0f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1c100 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1c110 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1c120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c130 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1c140 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1c150 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
1c160 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1c170 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1c180 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  >pgno;.    if( p
1c190 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1c1a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1c1b0 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  ager)-1) ){.    
1c1c0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c1d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c1f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c200 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
1c210 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
1c220 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
1c230 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
1c240 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
1c250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
1c260 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1c270 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
1c280 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
1c290 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
1c2a0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
1c2b0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1c2c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c2d0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
1c2e0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
1c2f0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
1c300 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
1c310 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
1c320 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
1c330 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
1c340 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
1c350 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
1c360 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
1c370 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
1c380 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1c390 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1c3a0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
1c3b0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
1c3c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
1c3d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
1c3e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c3f0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
1c400 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1c410 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c420 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c430 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
1c440 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
1c450 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
1c460 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
1c470 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
1c480 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1c490 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1c4a0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1c4b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c4c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1c4d0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1c500 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1c510 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1c520 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1c530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c550 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1c560 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1c570 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
1c580 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
1c590 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
1c5a0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1c5b0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1c5c0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1c5d0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1c5e0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1c5f0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1c600 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1c610 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1c620 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1c630 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c640 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
1c650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1c660 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1c670 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1c680 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1c690 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1c6a0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1c6b0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1c6c0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1c6d0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1c6e0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1c6f0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1c700 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1c710 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1c720 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1c730 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1c740 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1c750 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1c760 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1c770 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1c780 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1c790 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c7a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
1c7b0 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
1c7c0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1c7d0 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1c7e0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1c7f0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1c800 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1c810 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1c820 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1c830 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1c840 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1c850 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1c860 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1c870 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1c880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1c890 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1c8a0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1c8b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1c8c0 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1c8d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1c8e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1c8f0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1c900 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1c910 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1c920 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
1c930 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
1c940 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
1c950 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
1c960 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1c970 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
1c980 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1c990 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1c9a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1c9b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c9c0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1c9d0 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1c9e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1c9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ca00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1ca10 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1ca20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1ca30 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
1ca40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1ca50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ca60 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1ca70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ca80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ca90 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1caa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cac0 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
1cad0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1cae0 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
1caf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1cb00 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1cb10 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1cb20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1cb30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1cb40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1cb50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1cb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cb70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1cb80 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1cb90 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
1cba0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
1cbb0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
1cbc0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
1cbd0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
1cbe0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
1cbf0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
1cc00 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
1cc10 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
1cc20 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
1cc30 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
1cc40 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1cc50 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
1cc60 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
1cc70 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
1cc80 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
1cc90 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
1cca0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
1ccb0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1ccc0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1ccd0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
1cce0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ccf0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1cd00 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
1cd10 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1cd20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1cd30 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1cd40 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1cd50 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1cd60 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1cd70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1cd80 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1cd90 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1cda0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1cdb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cdc0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1cdd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1cde0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1cdf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1ce00 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1ce10 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1ce20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1ce30 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1ce40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ce50 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1ce60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ce70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ce80 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1ce90 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1cea0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1ceb0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1cec0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1ced0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1cee0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1cef0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1cf00 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1cf10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1cf20 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1cf30 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1cf40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1cf50 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1cf60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1cf70 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1cf80 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1cf90 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1cfa0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1cfb0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1cfc0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1cfd0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1cfe0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1cff0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1d000 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1d010 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1d020 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1d030 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1d040 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
1d050 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
1d060 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
1d070 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
1d080 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
1d090 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
1d0a0 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
1d0b0 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
1d0c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1d0d0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1d0e0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1d0f0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1d100 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1d110 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1d120 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1d130 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1d140 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1d150 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1d160 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1d170 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1d180 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1d190 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1d1a0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1d1b0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1d1c0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d1d0 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1d1e0 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1d1f0 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1d200 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1d210 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1d220 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1d230 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1d240 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1d250 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1d260 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1d270 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1d280 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1d290 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1d2a0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d2b0 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1d2c0 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1d2d0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1d2e0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1d2f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1d300 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1d310 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1d320 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1d330 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1d340 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1d350 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1d360 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1d370 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1d380 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1d390 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1d3a0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1d3b0 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1d3c0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1d3d0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1d3e0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1d3f0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1d400 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1d410 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1d420 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1d430 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d440 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1d450 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1d460 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1d470 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1d480 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1d490 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1d4a0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1d4b0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1d4c0 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1d4d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1d4e0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1d4f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1d500 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1d510 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1d520 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1d530 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1d540 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d550 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1d560 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1d570 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d580 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
1d590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d5a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1d5b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30  lwaysRollback==0
1d5c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d5d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1d5e0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1d5f0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d600 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  k = sqlite3Bitve
1d610 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1d620 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20  origDbSize);.   
1d630 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41   if( !pPager->pA
1d640 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1d650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d660 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d670 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
1d680 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1d690 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d6a0 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f  lback, pPg->pgno
1d6b0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1d6c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d  LITE_OK && (pPg-
1d6d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d6e0 54 59 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e  TY) && !pPager->
1d6f0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d710 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1d720 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1d730 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1d740 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
1d750 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
1d760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1d770 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d780 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
1d790 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
1d7a0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
1d7b0 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
1d7c0 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
1d7d0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1d7e0 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
1d7f0 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
1d800 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
1d810 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
1d820 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
1d830 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
1d840 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
1d850 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
1d860 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
1d870 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
1d880 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
1d890 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
1d8a0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
1d8b0 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
1d8c0 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
1d8d0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1d8e0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1d8f0 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
1d900 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
1d910 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
1d920 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
1d930 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
1d940 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
1d950 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
1d960 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1d970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
1d980 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
1d990 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1d9a0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1d9b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d9c0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1d9d0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
1d9e0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1d9f0 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 70 50  >pgno)).      pP
1da00 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1da10 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
1da20 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1da30 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
1da40 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1da50 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1da60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
1da70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1da80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
1da90 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1daa0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1dab0 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
1dac0 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
1dad0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1dae0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
1daf0 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
1db00 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
1db10 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
1db20 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
1db30 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
1db40 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
1db50 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
1db60 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  k journal..**.**
1db70 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
1db80 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61  yet actually rea
1db90 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
1dba0 20 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a   this page (if.*
1dbb0 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  * the PgHdr.need
1dbc0 52 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74  Read flag is set
1dbd0 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
1dbe0 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72  ine acts as a pr
1dbf0 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65  omise.** that we
1dc00 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64   will never need
1dc10 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
1dc20 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  e content in the
1dc30 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74   future..** so t
1dc40 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67  he needRead flag
1dc50 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
1dc60 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
1dc70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1dc80 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1dc90 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1dca0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1dcb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1dcc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dcd0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1dce0 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49  ERVED );..  /* I
1dcf0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1dd00 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1dd10 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68  or DontWrite() h
1dd20 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  as been called o
1dd30 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65  n.  ** this page
1dd40 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65   (DontWrite() se
1dd50 74 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  ts the alwaysRol
1dd60 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65  lback flag), the
1dd70 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  n this.  ** func
1dd80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1dd90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1dda0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1ddb0 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  =0 .   || sqlite
1ddc0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
1ddd0 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
1dde0 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a  ack, pPg->pgno).
1ddf0 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
1de00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1de10 7a 65 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ze.  ){.    retu
1de20 72 6e 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  rn;.  }..#ifdef 
1de30 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1de40 4c 45 54 45 0a 20 20 69 66 28 20 73 71 6c 69 74  LETE.  if( sqlit
1de50 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1de60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1de70 20 70 50 67 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20   pPg->pgno)!=0. 
1de80 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
1de90 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1dea0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e ){.    return;
1deb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1dec0 2a 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45  * If SECURE_DELE
1ded0 54 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  TE is disabled, 
1dee0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
1def0 20 77 61 79 20 74 68 61 74 20 74 68 69 73 0a 20   way that this. 
1df00 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20   ** routine can 
1df10 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  be called on a p
1df20 61 67 65 20 66 6f 72 20 77 68 69 63 68 20 73 71  age for which sq
1df30 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1df40 69 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e  ite().  ** has n
1df50 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ot been previous
1df60 6c 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  ly called during
1df70 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1df80 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20  ction..  ** And 
1df90 69 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68  if DontWrite() h
1dfa0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65  as previously be
1dfb0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66  en called, the f
1dfc0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f  ollowing.  ** co
1dfd0 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
1dfe0 20 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   met..  **.  ** 
1dff0 28 4c 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72  (Later:)  Not tr
1e000 75 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ue.  If the data
1e010 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
1e020 64 20 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c  d by having dupl
1e030 69 63 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73  icate.  ** pages
1e040 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e050 20 28 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74   (ex: corrupt9.t
1e060 65 73 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f  est) then the fo
1e070 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20  llowing is not. 
1e080 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20   ** necessarily 
1e090 74 72 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20  true:.  */.  /* 
1e0a0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e  assert( !pPg->in
1e0b0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1e0c0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1e0d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1e0e0 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ); */..  assert(
1e0f0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1e100 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal!=0 );.  sqli
1e110 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1e120 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1e130 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70   pPg->pgno);.  p
1e140 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
1e150 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
1e160 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1e170 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
1e180 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e190 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  mtSize >= pPager
1e1a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1e1b0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
1e1c0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1e1d0 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
1e1e0 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
1e1f0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1e200 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1e210 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1e220 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1e230 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41  ;.  IOTRACE(("GA
1e240 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
1e250 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1e260 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  o)).}.../*.** Th
1e270 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e280 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1e290 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1e2a0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1e2b0 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1e2c0 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1e2d0 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1e2e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1e2f0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1e300 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1e310 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b  , int isDirect){
1e320 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
1e330 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
1e340 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
1e350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
1e360 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
1e370 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1e380 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  E.  assert( isDi
1e390 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69  rect==0 );  /* i
1e3a0 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20  sDirect is only 
1e3b0 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20  true for atomic 
1e3c0 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66  writes */.#endif
1e3d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1e3e0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1e3f0 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
1e400 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1e410 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1e420 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e430 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1e440 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
1e450 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e460 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1e470 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44  c;..    if( !isD
1e480 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72  irect ){.      r
1e490 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e4a0 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
1e4b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e4c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e4d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1e4e0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
1e4f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e510 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1e520 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1e530 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1e540 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1e550 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
1e560 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1e570 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1e580 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e590 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
1e5a0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
1e5b0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1e5c0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32  pPgHdr->pData)+2
1e5d0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e5e0 72 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  r);..#ifdef SQLI
1e5f0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1e600 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20 69  _WRITE.    if( i
1e610 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67 65  sDirect && pPage
1e620 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1e630 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76  ){.      const v
1e640 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48  oid *zBuf = pPgH
1e650 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  dr->pData;.     
1e660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1e670 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1e680 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
1e690 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
1e6a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1e6b0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1e6c0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1e6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1e6e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1e6f0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
1e700 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
1e710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1e730 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
1e740 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
1e750 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1e760 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e770 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1e780 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
1e790 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1e7a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
1e7b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1e7c0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1e7d0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
1e7e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e7f0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1e800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e810 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1e820 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1e830 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1e840 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1e850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1e860 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1e870 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1e880 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1e890 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1e8a0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1e8b0 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1e8c0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1e8d0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1e8e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1e8f0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1e900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1e910 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1e920 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1e930 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1e940 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1e950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e960 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1e970 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1e980 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1e990 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1e9a0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1e9b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1e9c0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1e9d0 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1e9e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1e9f0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1ea00 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1ea10 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1ea20 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1ea30 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1ea40 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1ea50 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1ea60 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1ea70 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
1ea80 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1ea90 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1eaa0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1eab0 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1eac0 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1ead0 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1eae0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1eaf0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1eb00 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1eb10 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
1eb20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
1eb30 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
1eb40 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
1eb50 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
1eb60 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
1eb70 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
1eb80 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
1eb90 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
1eba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ebb0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
1ebc0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
1ebd0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
1ebe0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ebf0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
1ec00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1ec10 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1ec20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ec30 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1ec40 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67 6e  *zMaster, .  Pgn
1ec50 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20  o nTrunc,.  int 
1ec60 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20  noSync.){.  int 
1ec70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ec80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1ec90 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
1eca0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1ecb0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
1ecc0 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68 61  If no changes ha
1ecd0 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77 65  ve been made, we
1ece0 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20 74   can leave the t
1ecf0 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c 79  ransaction early
1ed00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1ed10 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
1ed20 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70  =0 &&.        (p
1ed30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1ed40 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1ed50 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a  LMODE_DELETE ||.
1ed60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1ed70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21  ->exclusiveMode!
1ed80 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =0) ){.    asser
1ed90 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
1eda0 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
1edb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1edc0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1edd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ede0 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
1edf0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1ee00 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1ee10 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1ee20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1ee30 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1ee40 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1ee50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1ee60 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1ee70 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1ee80 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1ee90 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1eea0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1eeb0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1eec0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1eed0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1eee0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1eef0 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1ef00 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1ef10 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1ef20 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20  r *pPg;..#ifdef 
1ef30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
1ef40 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f  OMIC_WRITE.    /
1ef50 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  * The atomic-wri
1ef60 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
1ef70 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61  can be used if a
1ef80 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ll of the.    **
1ef90 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1efa0 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue:.    **.    
1efb0 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65  **    + The file
1efc0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
1efd0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
1efe0 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
1eff0 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
1f000 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
1f010 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ize, and.    ** 
1f020 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74     + This commit
1f030 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1f040 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
1f050 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
1f060 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c    **    + Exactl
1f070 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
1f080 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
1f090 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
1f0a0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
1f0b0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
1f0c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
1f0d0 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20  n be used, then 
1f0e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f0f0 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20   will never.    
1f100 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f  ** be created fo
1f110 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
1f120 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1f130 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  nt useAtomicWrit
1f140 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e;.    pPg = sql
1f150 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1f160 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1f170 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f  che);.    useAto
1f180 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
1f190 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
1f1a0 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
1f1b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1f1c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1f1d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
1f1e0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
1f1f0 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
1f200 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20  nTrunc==0 && .  
1f210 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20 7c 7c        (pPg==0 ||
1f220 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d 30 29   pPg->pDirty==0)
1f230 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
1f240 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1f250 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
1f260 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1f270 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f280 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28  E_OFF );.    if(
1f290 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20   useAtomicWrite 
1f2a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
1f2b0 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  te the nRec fiel
1f2c0 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
1f2d0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1f2e0 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61  int offset = pPa
1f2f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1f300 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
1f310 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61  lMagic);.      a
1f320 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1f330 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63  ec==1);.      rc
1f340 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1f350 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73  Pager->jfd, offs
1f360 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  et, pPager->nRec
1f370 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
1f380 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
1f390 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1f3a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
1f3b0 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20  ll will modify. 
1f3c0 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d       ** the in-m
1f3d0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
1f3e0 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74  tion of page 1 t
1f3f0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
1f400 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63  dated.      ** c
1f410 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
1f420 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
1f430 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20  e 1 directly to 
1f440 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1f450 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61     ** file. Beca
1f460 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
1f470 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
1f480 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
1f490 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20  e-system, .     
1f4a0 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66 65   ** this is safe
1f4b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f4c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f4e0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1f4f0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1f500 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  er, 1);.      }.
1f510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
1f530 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
1f540 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a  r->jfd);.    }..
1f550 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d      if( !useAtom
1f560 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d 53  icWrite && rc==S
1f570 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69  QLITE_OK ).#endi
1f580 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  f..    /* If a m
1f590 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f5a0 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
1f5b0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1f5c0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
1f5d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
1f5e0 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
1f5f0 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
1f600 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
1f610 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
1f620 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
1f630 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
1f640 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1f650 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
1f660 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
1f670 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
1f680 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
1f690 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
1f6a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
1f6b0 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
1f6c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1f6d0 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
1f6e0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1f6f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
1f700 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1f710 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1f720 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
1f730 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f740 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f750 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1f760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1f770 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1f780 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1f790 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1f7a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f7b0 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  M.        if( nT
1f7c0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1f7d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1f7e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f7f0 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1f800 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1f810 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1f820 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1f830 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1f840 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1f850 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1f860 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1f870 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
1f880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f890 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1f8a0 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d      Pgno iSkip =
1f8b0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
1f8c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1f8d0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1f8e0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1f8f0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1f900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f910 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
1f920 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1f930 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
1f940 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1f950 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f960 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1f970 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1f990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f9a0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1f9c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f9d0 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1f9e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f9f0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1fa00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fa10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fa20 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fa30 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1fa40 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a 20  }.          } . 
1fa50 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1fa60 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1fa70 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1fa80 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1fa90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1faa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1fab0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1fac0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1fad0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1fae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1faf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb00 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fb10 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
1fb20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fb30 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1fb40 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1fb50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb60 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1fb70 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1fb80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb90 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fba0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1fbb0 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1fbc0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1fbd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fbe0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1fbf0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fc00 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1fc10 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1fc20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1fc30 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1fc40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fc50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
1fc60 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1fc70 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
1fc80 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
1fc90 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65  error might have
1fca0 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20   left the dirty 
1fcb0 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20  list all fouled 
1fcc0 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a  up here,.      *
1fcd0 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  * but that does 
1fce0 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
1fcf0 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65  se if the if the
1fd00 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a   dirty list did.
1fd10 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72        ** get cor
1fd20 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65  rupted, then the
1fd30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1fd40 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a  l roll back and.
1fd50 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64        ** discard
1fd60 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e   the dirty list.
1fd70 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73    There is an as
1fd80 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sert in.      **
1fd90 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1fda0 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61  irty_pages() tha
1fdb0 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
1fdc0 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20  no attempt.     
1fdd0 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75   ** is made to u
1fde0 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69  se an invalid di
1fdf0 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  rty list..      
1fe00 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79  */.      goto sy
1fe10 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nc_exit;.    }. 
1fe20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1fe30 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
1fe40 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20  >pPCache);..    
1fe50 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
1fe60 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1fe70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1fe80 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
1fe90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fea0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1feb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1fec0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
1fed0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
1fee0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
1fef0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
1ff00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1ff10 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
1ff20 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
1ff30 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1ff40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ff50 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
1ff60 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
1ff70 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
1ff80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ff90 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
1ffa0 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
1ffb0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
1ffc0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
1ffd0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
1ffe0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
1fff0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
20000 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
20010 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
20020 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
20030 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
20040 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
20050 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
20060 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
20070 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
20080 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
20090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
200a0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
200b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
200c0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
200d0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
200e0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
200f0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
20100 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
20110 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
20120 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
20130 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
20140 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
20150 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20160 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
20170 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
20180 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
20190 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
201a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
201b0 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
201c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
201d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
201e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
201f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
20200 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
20210 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
20220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
20230 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
20240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20250 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
20260 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
20270 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
20280 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
20290 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
202a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
202b0 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
202c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
202d0 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
202e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
202f0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
20300 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20310 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
20320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20330 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
20340 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
20350 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20360 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r));.  assert( p
20370 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
20380 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45  GER_SYNCED || ME
20390 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  MDB || !pPager->
203a0 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
203b0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
203c0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
203d0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
203e0 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ster);.  rc = pa
203f0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
20400 2c 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  , rc);.  return 
20410 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
20420 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
20430 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
20440 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
20450 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
20460 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
20470 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
20480 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
20490 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
204a0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
204b0 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
204c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
204d0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
204e0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
204f0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
20500 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
20510 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
20520 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75  ng protocol or u
20530 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
20540 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
20550 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
20560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
20570 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
20580 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
20590 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
205a0 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
205b0 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
205c0 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
205d0 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
205e0 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
205f0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
20600 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
20610 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
20620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20630 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
20640 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20660 4b 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  K;.  PAGERTRACE2
20670 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
20680 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20690 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
206a0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
206b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
206c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
206d0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
206e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
206f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
20700 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
20710 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20720 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20730 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20740 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
20750 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20760 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
20770 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
20780 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20790 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
207a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
207b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
207c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
207d0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
207e0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
207f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
20800 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
20810 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
20820 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20830 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
20840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
20850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20870 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
20880 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20890 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
208a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
208b0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
208c0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
208d0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
208e0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
208f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
20900 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20910 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
20920 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
20930 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
20940 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
20950 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
20960 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
20970 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
20980 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
20990 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
209a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
209b0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
209c0 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
209d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
209e0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
209f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20a00 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
20a10 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
20a20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
20a30 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
20a40 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
20a50 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
20a60 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
20a70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20a80 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20a90 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
20aa0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
20ab0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20ac0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
20ad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20ae0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
20af0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20b00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
20b10 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
20b20 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
20b30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
20b50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
20b60 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
20b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20b80 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
20b90 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
20ba0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
20bb0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
20bc0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
20bd0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
20be0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20bf0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
20c00 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
20c10 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
20c20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
20c30 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
20c40 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
20c50 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
20c60 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
20c70 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
20c80 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
20c90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20ca0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20cb0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
20cc0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
20cd0 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
20ce0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
20cf0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
20d00 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
20d10 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
20d20 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
20d30 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
20d40 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
20d50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
20d60 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
20d70 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
20d80 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
20d90 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
20da0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
20db0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
20dc0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
20dd0 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
20de0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
20df0 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
20e00 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
20e10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20e20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
20e30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
20e40 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
20e50 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
20e60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20e70 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
20e80 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
20e90 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
20ea0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
20eb0 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
20ec0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
20ed0 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
20ee0 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
20ef0 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
20f00 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
20f10 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
20f20 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
20f30 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20f40 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
20f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20f60 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
20f70 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
20f80 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
20f90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20fa0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
20fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20fc0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
20fd0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
20fe0 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
20ff0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21000 67 65 72 29 29 3b 0a 20 20 69 66 28 20 21 70 50  ger));.  if( !pP
21010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21020 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
21030 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21040 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
21050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
21060 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
21070 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
21080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21090 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  pInStmt==0 );.  
210a0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
210b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
210c0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
210d0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
210e0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
210f0 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
21100 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
21110 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
21120 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
21130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21140 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
21150 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
21160 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
21170 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
21180 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
21190 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
211a0 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
211b0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
211c0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
211d0 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
211e0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
211f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
21200 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
21210 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
21220 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
21230 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
21240 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 74 66 64  pen(pPager->stfd
21250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21270 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
21280 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
21290 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
212a0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
212b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
212c0 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
212d0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
212e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
212f0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
21300 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
21310 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
21320 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21330 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
21340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21350 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
21360 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
21370 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->pInStmt ){.  
21380 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21390 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
213a0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
213b0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
213c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
213d0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
213e0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
213f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21400 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
21410 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  pagerStmtBegin(p
21420 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21430 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
21440 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
21450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21460 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
21470 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21490 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
214a0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
214b0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
214c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
214d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
214e0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
214f0 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->pInStmt);.    
21500 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
21510 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
21520 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
21530 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
21540 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  nUse = 0;.    if
21550 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
21560 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 74  urnal(pPager->st
21570 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  fd) ){.      sql
21580 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
21590 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
215a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
215b0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
215c0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
215d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
215e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
215f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
21600 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
21610 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
21620 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21630 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
21640 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
21650 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
21660 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
21670 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21680 67 65 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ger));.    rc = 
21690 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
216a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
216b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
216c0 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
216d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
216e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
216f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
21700 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
21710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21720 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
21730 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
21740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21750 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21760 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
21770 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
21780 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21790 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
217a0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
217b0 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
217c0 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
217d0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
217e0 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
217f0 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
21800 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21810 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
21820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21830 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
21840 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
21850 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
21860 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
21870 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
21880 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
21890 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
218a0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
218b0 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
218c0 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
218d0 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
218e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
218f0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
21900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21910 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
21920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21930 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
21940 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
21950 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21960 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21970 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
21980 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21990 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
219a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
219b0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
219c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
219d0 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
219e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
219f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
21a00 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
21a10 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
21a20 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
21a30 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
21a40 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
21a50 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
21a60 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
21a70 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
21a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21a90 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
21aa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21ab0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
21ac0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
21ad0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
21ae0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
21af0 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
21b00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b10 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
21b20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
21b30 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
21b40 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
21b50 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
21b60 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
21b70 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
21b80 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
21b90 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
21ba0 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64  CodecArg;.}.#end
21bb0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
21bc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21bd0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
21be0 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
21bf0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
21c00 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
21c10 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
21c20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
21c30 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
21c40 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
21c50 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
21c60 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
21c70 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
21c80 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
21c90 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
21ca0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
21cb0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
21cc0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
21cd0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
21ce0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
21cf0 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
21d00 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
21d10 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
21d20 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
21d30 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
21d40 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
21d50 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
21d60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
21d70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
21d80 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
21d90 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
21da0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
21db0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
21dc0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
21dd0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
21de0 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
21df0 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
21e00 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
21e10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
21e20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
21e30 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
21e40 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
21e50 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
21e60 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
21e70 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
21e80 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
21e90 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
21ea0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
21eb0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
21ec0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
21ed0 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
21ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
21ef0 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
21f00 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
21f10 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
21f20 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
21f30 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
21f40 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
21f50 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
21f60 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
21f70 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
21f80 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
21f90 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
21fa0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
21fb0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
21fc0 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
21fd0 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
21fe0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
21ff0 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
22000 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
22010 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
22020 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
22030 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
22040 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
22050 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
22060 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
22070 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e  /* The page bein
22080 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a  g overwritten. *
22090 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  /.  Pgno needSyn
220a0 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  cPgno = 0;..  as
220b0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
220c0 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  0 );..  PAGERTRA
220d0 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
220e0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
220f0 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
22100 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
22110 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
22120 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67  pgno, (pPg->flag
22130 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
22140 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a 20  C)?1:0, pgno);. 
22150 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
22160 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
22170 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
22180 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f  pgno))..  pager_
22190 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
221a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
221b0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
221c0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
221d0 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  re page pPg->pgn
221e0 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72  o can.  ** be wr
221f0 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20  itten to, store 
22200 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63  pPg->pgno in loc
22210 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64  al variable need
22220 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20  SyncPgno..  **. 
22230 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d   ** If the isCom
22240 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  mit flag is set,
22250 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
22260 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
22270 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  at.  ** the jour
22280 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
22290 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
222a0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50  database page pP
222b0 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61  g->pgno .  ** ca
222c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
222d0 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
222e0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
222f0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
22300 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
22310 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
22320 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20  R_NEED_SYNC) && 
22330 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  !isCommit ){.   
22340 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
22350 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
22360 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
22370 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
22380 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
22390 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
223a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
223b0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
223c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
223d0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
223e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
223f0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
22400 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
22410 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
22420 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
22430 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
22440 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
22450 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
22460 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
22470 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
22480 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
22490 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
224a0 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
224b0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
224c0 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
224d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c  ..  */.  pPg->fl
224e0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
224f0 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c  ED_SYNC;.  pPgOl
22500 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
22510 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
22520 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c    assert( !pPgOl
22530 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  d || pPgOld->nRe
22540 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50  f==1 );.  if( pP
22550 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d  gOld ){.    pPg-
22560 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c  >flags |= (pPgOl
22570 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  d->flags&PGHDR_N
22580 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a  EED_SYNC);.  }..
22590 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
225a0 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
225b0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
225c0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
225d0 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20  eDrop(pPgOld);. 
225e0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61   }..  sqlite3Pca
225f0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
22600 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
22610 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70  tyCache = 1;.  p
22620 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
22630 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  d = 1;..  if( ne
22640 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
22650 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
22660 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
22670 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
22680 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
22690 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
226a0 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
226b0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
226c0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
226d0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
226e0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
226f0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
22700 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
22710 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
22720 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20  the .    ** "is 
22730 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65  journaled" bitve
22740 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20  c flag has been 
22750 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
22760 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
22770 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67  y.    ** loading
22780 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22790 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
227a0 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
227b0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  gHdr.needSync . 
227c0 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20     ** flag..    
227d0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
227e0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
227f0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22800 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61  he page-cache fa
22810 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a  ils, (due.    **
22820 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   to a malloc() o
22830 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63  r IO failure), c
22840 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20  lear the bit in 
22850 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d  the pInJournal[]
22860 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f  .    ** array. O
22870 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
22880 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
22890 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69  and written agai
228a0 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  n in.    ** this
228b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
228c0 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
228d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
228e0 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20  file before.    
228f0 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  ** it is synced 
22900 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
22910 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c   file. This way,
22920 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69   it may end up i
22930 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
22940 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c  rnal file twice,
22950 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74   but that is not
22960 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
22970 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
22980 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
22990 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
229a0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
229b0 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
229c0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
229d0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
229e0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
229f0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
22a00 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
22a10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22a20 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
22a30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22a40 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
22a50 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
22a60 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
22a70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22a80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
22a90 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
22aa0 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   && needSyncPgno
22ab0 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
22ac0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22ad0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
22ae0 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
22af0 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
22b00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
22b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22b20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
22b30 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
22b40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22b50 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20  r->noSync==0 && 
22b60 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50  !MEMDB );.    pP
22b70 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  gHdr->flags |= P
22b80 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
22b90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22ba0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64  eMakeDirty(pPgHd
22bb0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
22bc0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
22bd0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
22be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
22bf0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
22c00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22c10 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
22c20 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
22c30 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
22c40 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
22c50 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73  Page *pPg){.  as
22c60 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
22c70 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  0 || pPg->pPager
22c80 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74  ->memDb );.  ret
22c90 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  urn pPg->pData;.
22ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22cb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22cc0 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
22cd0 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
22ce0 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
22cf0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
22d00 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
22d10 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
22d20 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
22d30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
22d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
22d50 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
22d60 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50  eturn (pPager?pP
22d70 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a  g->pExtra:0);.}.
22d80 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
22d90 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
22da0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
22db0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
22dc0 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
22dd0 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
22de0 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
22df0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22e00 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
22e10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
22e20 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
22e30 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
22e40 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
22e50 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
22e60 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
22e70 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
22e80 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
22e90 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
22ea0 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
22eb0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
22ec0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
22ed0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
22ee0 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
22ef0 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
22f00 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
22f10 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
22f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
22f30 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
22f40 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
22f50 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
22f60 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
22f70 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
22f80 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
22f90 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
22fa0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
22fb0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
22fc0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
22fd0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
22fe0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
22ff0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
23000 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
23010 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
23020 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
23030 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
23040 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
23050 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
23060 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
23070 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
23080 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
23090 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
230a0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
230b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
230c0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
230d0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
230e0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
230f0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
23100 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
23110 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
23120 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
23130 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
23140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23150 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
23160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23170 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
23180 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23190 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
231a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
231b0 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OFF.**.** If th
231c0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
231d0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
231e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
231f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
23200 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
23210 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
23220 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
23230 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
23240 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
23250 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a   journal-mode..*
23260 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23270 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  erJournalMode(Pa
23280 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23290 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 21   eMode){.  if( !
232a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
232b0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
232c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
232d0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
232e0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
232f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
23300 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
23310 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
23320 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
23330 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
23340 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
23350 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23360 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
23370 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
23380 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23390 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
233a0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
233b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
233c0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
233d0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
233e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
233f0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  <0 );.    if( eM
23400 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode>=0 ){.      
23410 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
23420 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 20  ode = eMode;.   
23430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
23440 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
23450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
23460 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20  UERY );.    }.  
23470 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
23480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
23490 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
234a0 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
234b0 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
234c0 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
234d0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73   files..*/.i64 s
234e0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
234f0 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
23500 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
23510 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
23520 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
23530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
23540 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
23550 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
23560 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
23570 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e  izeLimit;.}..#en
23580 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23590 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.