/ Hex Artifact Content
Login

Artifact 5a6b59089511db451df45414eb137110b04b1419:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 38  : pager.c,v 1.48
0350: 37 20 32 30 30 38 2f 30 39 2f 30 33 20 30 30 3a  7 2008/09/03 00:
0360: 30 38 3a 32 39 20 64 72 68 20 45 78 70 20 24 0a  08:29 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 33  -counter */.  u3
2030: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
2040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2050: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
2060: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2070: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2090: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
20a0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
20b0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20e0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
20f0: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2110: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2120: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2130: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2140: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2150: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2160: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2170: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2180: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21b0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
21c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
21d0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
21e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21f0: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2200: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2210: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2220: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2240: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2250: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2260: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2270: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2280: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2290: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
22a0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
22b0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
22c0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
22d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
22f0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2300: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2310: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2320: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2330: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2340: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2350: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2360: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2370: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2380: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
2390: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
23a0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
23b0: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
23c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
23e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
23f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2420: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
2430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2440: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2450: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2460: 61 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65  abase */.  Bitve
2470: 63 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  c *pAlwaysRollba
2480: 63 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69  ck;    /* One bi
2490: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
24a0: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f  marked always-ro
24b0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72  llback */.  char
24c0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24f0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2500: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2510: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2540: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2550: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2560: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2570: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2580: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2590: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
25a0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
25b0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
25c0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
25d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25e0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *stfd;         /
25f0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2600: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
2610: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
2620: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2630: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2640: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2650: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2660: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2670: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2680: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2690: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
26a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
26e0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
26f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
2700: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
2710: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2720: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2730: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
2740: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
2750: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
2760: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
2770: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
2780: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
2790: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
27a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
27c0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
27d0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
27e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
27f0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
2800: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
2810: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
2820: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2830: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
2840: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
2850: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
2860: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
2870: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
2880: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
2890: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
28a0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
28b0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
28c0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
28d0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
28e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
28f0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2900: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2910: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
2920: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
2930: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2940: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
2950: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2960: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
2970: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
2980: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
2990: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
29a0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
29b0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
29c0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
29d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
29e0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
29f0: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
2a00: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a20: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
2a30: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2a40: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
2a50: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
2a60: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
2a70: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
2a80: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2a90: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
2aa0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
2ab0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
2ac0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
2ad0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
2ae0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
2af0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2b00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
2b10: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
2b20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
2b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
2b40: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
2b50: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
2b60: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
2b70: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
2b80: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
2b90: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
2ba0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
2bb0: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
2bc0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
2bd0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
2be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2bf0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
2c00: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2c10: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
2c20: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
2c30: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
2c40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2c50: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2c60: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
2c70: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
2c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
2c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2ca0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
2cb0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
2cc0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2ce0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
2cf0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
2d00: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
2d10: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
2d20: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
2d30: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2d40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2d50: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2d60: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2d70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2d80: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2d90: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2da0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2db0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2dc0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2dd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2de0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
2df0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
2e00: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
2e10: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2e20: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
2e30: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
2e40: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
2e50: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
2e60: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
2e70: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
2e80: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
2e90: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2ea0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
2eb0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
2ec0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
2ed0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
2ee0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
2ef0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
2f00: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
2f10: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2f20: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
2f30: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
2f40: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
2f50: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
2f60: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
2f70: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
2f80: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
2f90: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
2fa0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2fb0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
2fc0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
2fd0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
2fe0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
2ff0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3000: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3010: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3020: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3030: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3040: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3050: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3060: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3070: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3080: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3090: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
30a0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
30b0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
30c0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
30d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
30e0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
30f0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3100: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3110: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3120: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3130: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3140: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3150: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3160: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3170: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3180: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3190: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
31a0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
31b0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
31c0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
31d0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
31e0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
31f0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3200: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3210: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3220: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3230: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3240: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3250: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3260: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3270: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3280: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3290: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
32a0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
32b0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
32c0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
32d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
32e0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
32f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3300: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3310: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3320: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3330: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3350: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3360: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3370: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3380: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3390: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
33a0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
33b0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
33c0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
33d0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
33e0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
33f0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3400: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
34a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
34b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
34c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
34d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
34e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
34f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
35a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
35b0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
35c0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
35d0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
35e0: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
35f0: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
3600: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
3610: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
3620: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
3630: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
3640: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3650: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
3660: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3680: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
3690: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
36a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
36b0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
36c0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
36d0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
36e0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
36f0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
3700: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
3710: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
3720: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
3730: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
3740: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
3750: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
3760: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3770: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
3780: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3790: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
37a0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
37b0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
37c0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
37d0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
37e0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
37f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3800: 65 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68  e if page *pPg h
3810: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
3820: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
3830: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72  tatement.** jour
3840: 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  nal (or statemen
3850: 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62  t snapshot has b
3860: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20  een created, if 
3870: 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20  *pPg is part.** 
3880: 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  of an in-memory 
3890: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
38a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53  atic int pageInS
38b0: 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a  tatement(PgHdr *
38c0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
38d0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
38e0: 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  ger;.  if( MEMDB
38f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3900: 50 67 2d 3e 61 70 53 61 76 65 5b 31 5d 21 3d 30  Pg->apSave[1]!=0
3910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3920: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
3930: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
3940: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
3950: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
3960: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3970: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3980: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3990: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
39a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
39b0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
39c0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39d0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39e0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
3a00: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
3a10: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3a20: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a30: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a40: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a60: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
3a70: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
3a80: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
3a90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3aa0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
3ab0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
3ac0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
3ad0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
3ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3af0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
3b00: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
3b10: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
3b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
3b30: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
3b40: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
3b50: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
3b60: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
3b70: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
3b80: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
3b90: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
3ba0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
3bb0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3bc0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
3bd0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3be0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
3bf0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
3c00: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
3c10: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
3c20: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c40: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
3c50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
3c60: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
3c70: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
3c80: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
3c90: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
3ca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
3cb0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
3cc0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
3cd0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
3ce0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
3cf0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
3d00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
3d10: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
3d20: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
3d30: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
3d40: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
3d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d60: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
3d70: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3d80: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
3d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3da0: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
3db0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3dc0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
3dd0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
3de0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
3df0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
3e00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
3e10: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
3e20: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
3e30: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3e40: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
3e50: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
3e60: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
3e70: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3e80: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
3e90: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
3ea0: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
3eb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
3ec0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
3ed0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
3ee0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
3ef0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
3f00: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
3f10: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
3f20: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
3f30: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
3f40: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
3f50: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3f60: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
3f70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3f80: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
3f90: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
3fa0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
3fb0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
3fc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3fd0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
3ff0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
4000: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
4010: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
4020: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
4030: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
4040: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
4050: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
4060: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
4070: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
4080: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
4090: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
40a0: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
40b0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
40c0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
40d0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
40e0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
40f0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
4100: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
4110: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
4120: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
4130: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
4140: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
4150: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
4160: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
4170: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
4180: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
4190: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
41a0: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
41b0: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
41c0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
41d0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
41e0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
41f0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
4200: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4210: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
4220: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
4230: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4240: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
4250: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4260: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4270: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4280: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4290: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
42a0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
42b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
42c0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
42d0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
42e0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
42f0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4300: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4310: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4320: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4330: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4340: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4350: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4360: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4370: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4380: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4390: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
43a0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
43b0: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
43c0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
43d0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
43e0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
43f0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
4400: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4410: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
4420: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
4430: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
4440: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
4450: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
4460: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
4470: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
4480: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4490: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
44a0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
44b0: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
44c0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
44d0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
44e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
44f0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
4500: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
4510: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
4520: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
4530: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
4540: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
4550: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
4560: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
4570: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
4580: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4590: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
45a0: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
45b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
45c0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
45d0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
45e0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
45f0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
4600: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4610: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4620: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
4630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4640: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
4650: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
4660: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
4670: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
4680: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4690: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
46a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
46b0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
46c0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
46d0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
46e0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
46f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
4700: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
4710: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
4720: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
4730: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
4740: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
4750: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
4760: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
4770: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
4780: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
4790: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
47a0: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
47b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
47c0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
47d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
47e0: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
47f0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
4800: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
4810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4830: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
4840: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
4850: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
4860: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4870: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
4880: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
4890: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
48a0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
48b0: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
48c0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
48d0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
48e0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
48f0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
4900: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
4910: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
4920: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4930: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
4940: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
4950: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
4960: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4970: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4980: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
4990: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
49a0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
49b0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
49c0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
49d0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
49e0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
49f0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
4a00: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
4a10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
4a20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
4a30: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
4a40: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
4a50: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
4a60: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4a70: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
4a80: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
4a90: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
4aa0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
4ab0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
4ac0: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
4ad0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
4ae0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
4af0: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
4b00: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
4b10: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
4b20: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
4b30: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
4b40: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
4b50: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
4b60: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
4b70: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
4b80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
4b90: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
4ba0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
4bb0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
4bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
4bd0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4be0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
4bf0: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
4c00: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
4c10: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 0a  rCode || MEMDB .
4c20: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
4c30: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
4c40: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
4c50: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4c60: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4c70: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
4c80: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
4c90: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
4ca0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
4cb0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4cc0: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
4cd0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4ce0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
4cf0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
4d00: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
4d10: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
4d20: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
4d30: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
4d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
4d50: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
4d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
4d70: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
4d80: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
4d90: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
4da0: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
4db0: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
4dc0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
4dd0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
4de0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
4df0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
4e00: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
4e10: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
4e20: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
4e30: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
4e40: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
4e50: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
4e60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
4e70: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
4e80: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
4e90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
4ea0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
4eb0: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
4ec0: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
4ed0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
4ee0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
4ef0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
4f00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
4f10: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
4f20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
4f30: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4f40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4f50: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
4f60: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
4f70: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
4f80: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4fa0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
4fb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4fc0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
4fd0: 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72  ter, int nMaster
4fe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
4ff0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5000: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5010: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5030: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5040: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5050: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5060: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5070: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5080: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5090: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
50a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
50b0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
50c0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
50d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
50e0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
50f0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5100: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
5110: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
5120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5140: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5150: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5160: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5170: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5180: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5190: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
51a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
51b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
51c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
51d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
51e0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
51f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5200: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5220: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5240: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5250: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5260: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5280: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5290: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
52a0: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
52b0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
52c0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
52d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
52e0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
52f0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
5300: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
5310: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
5320: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5330: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5340: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5350: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5360: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5370: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5380: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5390: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
53a0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
53b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
53c0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
53d0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
53e0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
53f0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5400: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5410: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5420: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5430: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5440: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5460: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5470: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5480: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5490: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
54a0: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
54b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
54c0: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
54d0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
54e0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
54f0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5500: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5510: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5530: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5540: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5550: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5560: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5590: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
55b0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
55c0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
55d0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
55e0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
55f0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5600: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5610: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
5620: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
5630: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5640: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5650: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5660: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5670: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5680: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5690: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
56a0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
56b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
56c0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
56d0: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
56e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
56f0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5700: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5710: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5720: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5730: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5740: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5750: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
5760: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
5770: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
5780: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5790: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
57a0: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
57b0: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
57c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
57d0: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
57e0: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
57f0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5800: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
5810: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5820: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
5830: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5840: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
5850: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
5860: 48 64 72 5b 32 38 5d 20 3d 20 7b 7d 3b 0a 0a 20  Hdr[28] = {};.. 
5870: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
5880: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 69  rnalOff ){.    i
5890: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
58a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
58b0: 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52 41  imit;..    IOTRA
58c0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
58d0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
58e0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
58f0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
5900: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5910: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
5920: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
5930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5940: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
5950: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
5960: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
5970: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
5980: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
5990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
59a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
59b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
59c0: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
59d0: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
59e0: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
59f0: 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
5a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
5a10: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
5a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5a30: 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68  committed but th
5a40: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20  e write lock .  
5a50: 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65    ** is still he
5a60: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ld on the file. 
5a70: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69  If there is a si
5a80: 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75  ze limit configu
5a90: 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  red for .    ** 
5aa0: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
5ab0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a  ournal and the j
5ac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
5ad0: 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d  ently consumes m
5ae0: 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  ore.    ** space
5af0: 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74   than that limit
5b00: 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75   allows for, tru
5b10: 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ncate it now. Th
5b20: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
5b30: 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68     ** to sync th
5b40: 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67  e file following
5b50: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
5b60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5b70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5b80: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
5b90: 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20     i64 sz;.     
5ba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5bb0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
5bc0: 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  jfd, &sz);.     
5bd0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5be0: 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20  OK && sz>iLimit 
5bf0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
5c00: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
5c10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  e(pPager->jfd, i
5c20: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
5c30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5c40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5c50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
5c60: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
5c70: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5c80: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
5c90: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
5ca0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5cb0: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
5cc0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
5cd0: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
5ce0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
5cf0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
5d00: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
5d10: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
5d20: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
5d30: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
5d40: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
5d50: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
5d60: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
5d70: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
5d80: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
5d90: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
5da0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
5db0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
5dc0: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
5dd0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
5de0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
5df0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
5e00: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
5e10: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
5e20: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
5e30: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
5e40: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5e50: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
5e60: 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  ze..** .** Follo
5e70: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
5e80: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
5e90: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
5ea0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
5eb0: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
5ec0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
5ed0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5ee0: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
5ef0: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
5f00: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69  ->pTmpSpace;.  i
5f10: 6e 74 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  nt nHeader = pPa
5f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
5f30: 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20   int nWrite;..  
5f40: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
5f50: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5f60: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
5f70: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
5f80: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5f90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
5fa0: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
5fb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
5fc0: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
5fd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
5fe0: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
5ff0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
6000: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6010: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6020: 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79  alOff;..  memcpy
6030: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
6040: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6050: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
6060: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
6070: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
6080: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
6090: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
60a0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
60b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
60c0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
60d0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
60e0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
60f0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
6100: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
6110: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
6120: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
6140: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
6150: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
6160: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
6170: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
6180: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
6190: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
61a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
61b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
61c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
61d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
61e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
61f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
6200: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
6210: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
6220: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
6230: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
6240: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
6250: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
6260: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
6270: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
6280: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
6290: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
62a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
62b0: 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  re occured whils
62c0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
62d0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
62e0: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
62f0: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
6300: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
6310: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
6320: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
6330: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
6340: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
6350: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
6360: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
6370: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
6380: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
6390: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
63a0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
63b0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
63c0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
63d0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
63e0: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
63f0: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
6400: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
6410: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
6420: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
6430: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
6440: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
6450: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
6460: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
6470: 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28  ->noSync);.  if(
6480: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
6490: 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  ) .   || (sqlite
64a0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
64b0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
64c0: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
64d0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
64e0: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
64f0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6500: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6510: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
6520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
6530: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6540: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6550: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
6560: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
6570: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6580: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6590: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
65a0: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
65b0: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
65c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
65d0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
65e0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
65f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
6600: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6610: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
6620: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
6630: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
6640: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6650: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6660: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
6670: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
6680: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
6690: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
66a0: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
66b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
66c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
66d0: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
66e0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
66f0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6700: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
6710: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
6720: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
6730: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6740: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6750: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
6760: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
6770: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
6780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
6790: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
67a0: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
67b0: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
67c0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
67d0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
67e0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
67f0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
6800: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
6810: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6820: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6830: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
6840: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6850: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
6860: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
6870: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
6880: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6890: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
68a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
68b0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
68c0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
68d0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
68e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
68f0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
6900: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6910: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
6920: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
6930: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6940: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6950: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6960: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6970: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6980: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6990: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
69a0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
69b0: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
69c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
69d0: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
69e0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
69f0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
6a00: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
6a10: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
6a20: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
6a30: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6a40: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6a50: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6a60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6a70: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6a80: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6a90: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6aa0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6ab0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6ac0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6ad0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6ae0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
6af0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
6b00: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
6b10: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
6b20: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
6b30: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6b40: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6b50: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6b60: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6b70: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6b80: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6b90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6ba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6bb0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6bc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6bd0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6be0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
6bf0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
6c00: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
6c10: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
6c20: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
6c30: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6c40: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6c50: 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
6c60: 69 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a  int iPageSize;..
6c70: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
6c80: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ca0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
6cb0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
6cc0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
6cd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6ce0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
6cf0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6d00: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
6d10: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
6d20: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6d30: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6d40: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
6d50: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6d60: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
6d70: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
6d80: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6d90: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6da0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6db0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6dd0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6de0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6df0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
6e00: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6e10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e20: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e30: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
6e40: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
6e50: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6e60: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6e70: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6e80: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6e90: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
6ea0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6eb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ec0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6ed0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6ee0: 6e 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a  nlOff+16, (u32 *
6ef0: 29 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20  )&iPageSize);.  
6f00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6f10: 4b 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69  K .   && iPageSi
6f20: 7a 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69  ze>=512 .   && i
6f30: 50 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  PageSize<=SQLITE
6f40: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
6f50: 20 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a     && ((iPageSiz
6f60: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d  e-1)&iPageSize)=
6f70: 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36  =0 .  ){.    u16
6f80: 20 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67   pagesize = iPag
6f90: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
6fa0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
6fb0: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
6fc0: 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a  &pagesize);.  }.
6fd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6fe0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
6ff0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
7000: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
7010: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
7020: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
7030: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
7040: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
7050: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7060: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7070: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7080: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7090: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
70a0: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
70b0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
70c0: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
70d0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
70e0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
70f0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
7100: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
7110: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
7120: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
7130: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7140: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7150: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32  jrnlOff+12, (u32
7160: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
7170: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
7180: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7190: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
71a0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
71b0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
71c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
71d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
71e0: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
71f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7200: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
7210: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7220: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
7230: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
7240: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
7250: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7260: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
7270: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
7280: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
7290: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
72a0: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
72b0: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
72c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
72d0: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
72e0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
72f0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
7300: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
7310: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
7320: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
7330: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
7340: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
7350: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
7360: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
7370: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
7380: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
7390: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
73a0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
73b0: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
73c0: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
73d0: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
73e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
73f0: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
7400: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
7410: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
7420: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
7430: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
7440: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
7450: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
7460: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
7470: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
7480: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
7490: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
74a0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
74b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
74c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
74d0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
74e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
74f0: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
7500: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
7510: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
7520: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7530: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7540: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7550: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
7560: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
7570: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
7580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7590: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
75a0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
75b0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
75c0: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
75d0: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
75e0: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
75f0: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7600: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7610: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7620: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7630: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7640: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
7650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7660: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
7670: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
7680: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
7690: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
76a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
76b0: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
76c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
76d0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65  lSync ){.    see
76e0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
76f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  er);.  }.  jrnlO
7700: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
7710: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
7720: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
7730: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
7740: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
7750: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
7760: 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
7770: 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  NO(pPager));.  i
7780: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7790: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
77a0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20  jrnlOff += 4;.. 
77b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
77c0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
77d0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
77e0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
77f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7800: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e  return rc;.  jrn
7810: 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20  lOff += len;..  
7820: 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20  put32bits(zBuf, 
7830: 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74  len);.  put32bit
7840: 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75  s(&zBuf[4], cksu
7850: 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  m);.  memcpy(&zB
7860: 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d  uf[8], aJournalM
7870: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
7880: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
7890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
78a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
78b0: 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28   zBuf, 8+sizeof(
78c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20  aJournalMagic), 
78d0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c  jrnlOff);.  jrnl
78e0: 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28  Off += 8+sizeof(
78f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
7900: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7910: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
7920: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
7930: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
7940: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
7950: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
7960: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
7970: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
7980: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
7990: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
79a0: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
79b0: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
79c0: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
79d0: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
79e0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
79f0: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
7a00: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
7a10: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
7a20: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
7a30: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
7a40: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
7a50: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
7a60: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
7a70: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
7a80: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
7a90: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
7aa0: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
7ab0: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
7ac0: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
7ad0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
7ae0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
7af0: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
7b00: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
7b10: 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
7b20: 4f 4b 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20  OK).   && (rc = 
7b30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
7b40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
7b50: 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49  jrnlSize))==SQLI
7b60: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c  TE_OK.   && jrnl
7b70: 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29  Size>jrnlOff.  )
7b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7b90: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
7ba0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7bb0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
7bc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
7bd0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7be0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
7bf0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
7c00: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
7c10: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7c20: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
7c30: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
7c40: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7c50: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7c60: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7c70: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7c80: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
7c90: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
7ca0: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
7cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
7cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
7cd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7ce0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7cf0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
7d00: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
7d10: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
7d20: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
7d30: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
7d40: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
7d50: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7d60: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
7d70: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
7d80: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
7d90: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
7da0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
7db0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
7dc0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7dd0: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7de0: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
7df0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
7e00: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 50  turn;.  sqlite3P
7e10: 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
7e20: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
7e30: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
7e40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7e50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
7e60: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
7e70: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
7e80: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
7e90: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
7ea0: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
7eb0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
7ec0: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
7ed0: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
7ee0: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
7ef0: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
7f00: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
7f10: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
7f20: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
7f30: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
7f40: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
7f50: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
7f60: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
7f70: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
7f80: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
7f90: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
7fa0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7fb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7fc0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7fd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7fe0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7ff0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
8000: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
8010: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
8020: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70        if( rc ) p
8030: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
8040: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
8050: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8060: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
8070: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
8080: 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a  ager))..      /*
8090: 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68   Always close th
80a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
80b0: 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
80c0: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a   database lock..
80d0: 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
80e0: 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e  se, another conn
80f0: 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
8100: 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
8110: 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 64  might.      ** d
8120: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
8130: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
8140: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8150: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8160: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
8170: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8180: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
8190: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
81a0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
81b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
81c0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
81d0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
81e0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  l);.        pPag
81f0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
8200: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
8210: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
8220: 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
8230: 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Rollback);.     
8240: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
8250: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
8260: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8270: 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
8280: 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
8290: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
82a0: 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
82b0: 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72  t be.      ** tr
82c0: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
82d0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
82e0: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
82f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
8300: 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63        ** cache c
8310: 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20  an be discarded 
8320: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
8330: 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65  de safely cleare
8340: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
8350: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
8360: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
8370: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8380: 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72  OK ) pPager->err
8390: 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
83a0: 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
83b0: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
83c0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
83d0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
83e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
83f0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8400: 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  stfd);.         
8410: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8420: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
8430: 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  nStmt);.        
8440: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
8450: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
8460: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
8470: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
8480: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
8490: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
84a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
84b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
84c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
84d0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
84e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
84f0: 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
8500: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
8510: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8520: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8530: 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
8540: 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  B || pPager->err
8550: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
8560: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
8570: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
8580: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61  NLOCK;.      pPa
8590: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
85a0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Done = 0;.    }.
85b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
85c0: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
85d0: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
85e0: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
85f0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
8600: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
8610: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
8620: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
8630: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a  e error state, .
8640: 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** do not attemp
8650: 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  t the rollback..
8660: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8670: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
8680: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b  lback(Pager *p){
8690: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
86a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e==SQLITE_OK && 
86b0: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
86c0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
86d0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
86e0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
86f0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
8700: 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c  back(p);.    sql
8710: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
8720: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67  loc();.  }.  pag
8730: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a  er_unlock(p);.}.
8740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8750: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
8760: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
8770: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
8780: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
8790: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
87a0: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
87b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
87c0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
87d0: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
87e0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
87f0: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
8800: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
8810: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
8820: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
8830: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
8840: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
8850: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
8860: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
8870: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
8880: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
8890: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
88a0: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
88b0: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
88c0: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
88d0: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
88e0: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
88f0: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
8900: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
8910: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
8920: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
8930: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
8940: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8950: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
8960: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
8970: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
8980: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
8990: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
89a0: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
89b0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
89c0: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
89d0: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
89e0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
89f0: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
8a00: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
8a10: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
8a20: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
8a30: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8a40: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8a50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8a60: 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a  int hasMaster){.
8a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8a80: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20  E_OK;.  int rc2 
8a90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
8aa0: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
8ab0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
8ac0: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
8ad0: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
8ae0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8af0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
8b00: 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
8b10: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
8b20: 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50  >stmtOpen && !pP
8b30: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8b40: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
8b50: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
8b60: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
8b70: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
8b80: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
8b90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8ba0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
8bb0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8bc0: 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  e .     || pPage
8bd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8be0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8bf0: 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b  E_PERSIST.    ){
8c00: 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
8c10: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
8c20: 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
8c30: 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
8c40: 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
8c50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8c60: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
8c70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8c80: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
8c90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8ca0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
8cb0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8cc0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8cd0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
8ce0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8cf0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
8d00: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
8d10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8d20: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
8d30: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
8d40: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
8d50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
8d60: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
8d70: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
8d80: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
8d90: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
8da0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
8db0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
8dc0: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
8dd0: 62 61 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65  back);.    pPage
8de0: 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
8df0: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ck = 0;.    sqli
8e00: 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
8e10: 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
8e20: 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
8e30: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
8e40: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
8e50: 74 65 72 61 74 65 28 70 50 61 67 65 72 2d 3e 70  terate(pPager->p
8e60: 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
8e70: 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e  t_pagehash);.#en
8e80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50  dif.    sqlite3P
8e90: 63 61 63 68 65 53 65 74 46 6c 61 67 73 28 70 50  cacheSetFlags(pP
8ea0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 0a 20  ager->pPCache,. 
8eb0: 20 20 20 20 20 20 7e 28 50 47 48 44 52 5f 49 4e        ~(PGHDR_IN
8ec0: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47 48 44 52  _JOURNAL | PGHDR
8ed0: 5f 4e 45 45 44 5f 53 59 4e 43 29 2c 20 30 0a 20  _NEED_SYNC), 0. 
8ee0: 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72     );.    pPager
8ef0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
8f00: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
8f10: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
8f20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8f30: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
8f40: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
8f50: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8f60: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
8f70: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
8f80: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
8f90: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
8fa0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8fb0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73  R_SHARED;.  }els
8fc0: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
8fd0: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
8fe0: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
8ff0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
9000: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
9010: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
9020: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
9030: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
9040: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
9050: 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72  ync = 0;.  /* lr
9060: 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e  uListSetFirstSyn
9070: 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  ced(pPager); */.
9080: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9090: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
90a0: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
90b0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
90c0: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
90d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
90e0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
90f0: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
9100: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
9110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
9120: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
9130: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
9140: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
9150: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
9160: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
9170: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
9180: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
9190: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
91a0: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
91b0: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
91c0: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
91d0: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
91e0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
91f0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
9200: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
9210: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
9220: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
9230: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
9240: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
9250: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
9260: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
9270: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
9280: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
9290: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
92a0: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
92b0: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
92c0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
92d0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
92e0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
92f0: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
9300: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
9310: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
9320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
9330: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
9340: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
9350: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
9360: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
9370: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
9380: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
9390: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
93a0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
93b0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
93c0: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
93d0: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
93e0: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
93f0: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
9400: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
9410: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
9420: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
9430: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
9440: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
9450: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
9460: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
9470: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
9480: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
9490: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
94a0: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
94b0: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
94c0: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
94d0: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
94e0: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
94f0: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
9500: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
9510: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
9520: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
9530: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
9540: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
9550: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
9560: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
9570: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
9580: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
9590: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
95a0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20  rn cksum;.}../* 
95b0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
95c0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
95d0: 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
95e0: 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  dr*);../*.** Rea
95f0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
9600: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9610: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
9620: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
9630: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
9640: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
9650: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
9660: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
9670: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
9680: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
9690: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
96a0: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
96b0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
96c0: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
96d0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
96e0: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
96f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
9700: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
9710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
9720: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
9730: 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
9740: 50 61 67 65 72 2c 20 20 20 20 20 20 20 2f 2a 20  Pager,       /* 
9750: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
9760: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
9770: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
9780: 66 64 2c 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  fd,   /* The fil
9790: 65 20 74 68 61 74 20 69 73 20 74 68 65 20 6a 6f  e that is the jo
97a0: 75 72 6e 61 6c 20 62 65 69 6e 67 20 72 6f 6c 6c  urnal being roll
97b0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
97c0: 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
97d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 74    /* Offset of t
97e0: 68 65 20 70 61 67 65 20 77 69 74 68 69 6e 20 74  he page within t
97f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
9800: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 20  int isMainJrnl  
9810: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
9820: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
9830: 6f 75 72 6e 61 6c 2e 20 46 61 6c 73 65 20 66 6f  ournal. False fo
9840: 72 20 53 74 6d 74 20 6a 72 6e 6c 20 2a 2f 0a 29  r Stmt jrnl */.)
9850: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
9860: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9880: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
9890: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
98a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
98d0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
98e0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
98f0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9910: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
9920: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
9930: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
9940: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
9950: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
9960: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
9970: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
9980: 69 73 4d 61 69 6e 4a 72 6e 6c 20 73 68 6f 75 6c  isMainJrnl shoul
9990: 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68  d be true for th
99a0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
99b0: 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a  nd false for.  *
99c0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
99d0: 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68  nals.  Verify th
99e0: 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  at this is alway
99f0: 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a  s the case.  */.
9a00: 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d    assert( jfd ==
9a10: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70   (isMainJrnl ? p
9a20: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
9a30: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
9a40: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
9a50: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
9a60: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
9a70: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
9a80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
9a90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
9aa0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
9ab0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
9ac0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
9ad0: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
9ae0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
9af0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
9b00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9b10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9b20: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
9b30: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
9b40: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
9b50: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
9b60: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
9b70: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
9b80: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
9b90: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
9ba0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
9bb0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
9bc0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
9bd0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
9be0: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
9bf0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9c00: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
9c10: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
9c20: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
9c30: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
9c40: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
9c50: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
9c60: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
9c70: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9c80: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
9c90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9ca0: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
9cb0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
9cc0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
9cd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9ce0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
9cf0: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
9d00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9d10: 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d  , offset+pPager-
9d20: 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
9d30: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
9d40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9d50: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9d60: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
9d70: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
9d80: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
9d90: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
9da0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
9dc0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
9dd0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
9de0: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
9df0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9e00: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
9e10: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9e20: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
9e30: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
9e40: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
9e50: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
9e60: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
9e70: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
9e80: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
9e90: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
9ea0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
9eb0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
9ec0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
9ed0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
9ee0: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
9ef0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
9f00: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
9f10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
9f20: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
9f30: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
9f40: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
9f50: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
9f60: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
9f70: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
9f80: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
9f90: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
9fa0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
9fb0: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
9fc0: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
9fd0: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
9fe0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
9ff0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
a000: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
a010: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
a020: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
a030: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
a040: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
a050: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
a060: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
a070: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
a080: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
a090: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
a0a0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
a0b0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
a0c0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
a0d0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
a0e0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
a0f0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
a100: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
a110: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
a120: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
a130: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
a140: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
a150: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
a160: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
a170: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
a180: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
a190: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
a1a0: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
a1b0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
a1c0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
a1d0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
a1e0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
a1f0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
a200: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
a210: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
a220: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
a230: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
a240: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
a250: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
a260: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
a270: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
a280: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
a290: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
a2a0: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
a2b0: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
a2c0: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
a2d0: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
a2e0: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
a2f0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
a300: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
a310: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
a320: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
a330: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
a340: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
a350: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
a360: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
a370: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
a380: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
a390: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
a3a0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
a3b0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
a3c0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
a3d0: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
a3e0: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
a3f0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
a400: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
a410: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
a420: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
a430: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
a440: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
a450: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
a460: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
a470: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
a480: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
a490: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
a4a0: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
a4b0: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
a4c0: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
a4d0: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
a4e0: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
a4f0: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
a500: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
a510: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
a520: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
a530: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
a540: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
a550: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
a560: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
a570: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
a580: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
a590: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
a5a0: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
a5b0: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
a5c0: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
a5d0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
a5e0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
a5f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
a600: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
a610: 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
a620: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29  PAGER_EXCLUSIVE)
a630: 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  .   && (pPg==0 |
a640: 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
a650: 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
a660: 29 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  )).   && (pPager
a670: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
a680: 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
a690: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
a6a0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
a6b0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
a6c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a6d0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
a6e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
a6f0: 20 6f 66 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66   ofst);.  }.  if
a700: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
a710: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
a720: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
a730: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
a740: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
a750: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
a760: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
a770: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
a780: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
a790: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
a7a0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
a7b0: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
a7c0: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
a7d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
a7e0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
a7f0: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
a800: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
a810: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
a820: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
a830: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
a840: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
a850: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
a860: 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
a870: 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
a880: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
a890: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a8a0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
a8b0: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
a8c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
a8d0: 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65  niter(pPg, pPage
a8e0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a8f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61    }.    if( isMa
a900: 69 6e 4a 72 6e 6c 20 29 20 6d 61 6b 65 43 6c 65  inJrnl ) makeCle
a910: 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
a920: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a930: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
a940: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
a950: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
a960: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
a970: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a980: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a990: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
a9a0: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
a9b0: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
a9c0: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
a9d0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
a9e0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
a9f0: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
aa00: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
aa10: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
aa20: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
aa30: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
aa40: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
aa50: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
aa60: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
aa70: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
aa80: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
aa90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
aaa0: 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
aab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
aac0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
aad0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
aae0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
aaf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ab00: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
ab10: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
ab20: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
ab30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ab40: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
ab50: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
ab60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab70: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
ab80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
ab90: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
aba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
abb0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
abc0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
abd0: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
abe0: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
abf0: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
ac00: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
ac10: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
ac20: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
ac30: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ac40: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
ac50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ac60: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
ac70: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
ac80: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
ac90: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
aca0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
acb0: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
acc0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
acd0: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
ace0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
acf0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
ad00: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
ad10: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
ad20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
ad30: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
ad40: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
ad50: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
ad60: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
ad70: 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
ad80: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
ad90: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
ada0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
adb0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
adc0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
add0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
ade0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
adf0: 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74  pMaster;.  sqlit
ae00: 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
ae10: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  l;.  char *zMast
ae20: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
ae30: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
ae40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ae50: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
ae60: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
ae70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
ae80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ae90: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
aea0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aeb0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
aec0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
aed0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
aee0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
aef0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
af00: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
af10: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
af20: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d  rence..  */.  pM
af30: 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
af40: 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
af50: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
af60: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
af70: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
af80: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
af90: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
afa0: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
afb0: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
afc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
afd0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
afe0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
aff0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
b000: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
b010: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
b020: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b030: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
b040: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
b050: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
b060: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b070: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
b080: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
b090: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
b0a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
b0b0: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
b0c0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
b0d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b0e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
b0f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
b100: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
b110: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
b120: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
b130: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
b140: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
b150: 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d  terPtr = pPager-
b160: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
b170: 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
b180: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
b190: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b1a0: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
b1b0: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
b1c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
b1d0: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
b1e0: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
b1f0: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
b200: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
b210: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
b220: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
b230: 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
b240: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  tr);.    if( !zM
b250: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
b260: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b270: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
b280: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b290: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61  t;.    }.    zMa
b2a0: 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
b2b0: 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
b2c0: 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72  rJournal];.    r
b2d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
b2e0: 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
b2f0: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
b300: 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
b310: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b320: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
b330: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
b340: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
b350: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
b360: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
b370: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
b380: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
b390: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73  {.      int exis
b3a0: 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ts;.      rc = s
b3b0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
b3c0: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
b3d0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
b3e0: 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
b3f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
b400: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b410: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
b420: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
b430: 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
b440: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
b450: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
b460: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
b470: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b480: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
b490: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
b4a0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
b4b0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
b4c0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
b4d0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
b4e0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
b4f0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
b500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
b510: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b520: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
b530: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
b540: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
b550: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
b560: 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
b570: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b580: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
b590: 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
b5a0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
b5b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
b5c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b5d0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
b5e0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
b5f0: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
b600: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
b610: 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
b620: 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
b630: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
b640: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
b650: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
b660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b670: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
b680: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
b690: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b6a0: 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
b6b0: 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
b6c0: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
b6d0: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
b6e0: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
b6f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
b700: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
b710: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
b720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b730: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
b740: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b750: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
b760: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
b770: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
b780: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
b790: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
b7a0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
b7b0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
b7c0: 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
b7d0: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
b7e0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
b7f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
b800: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
b810: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
b820: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
b830: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
b840: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ster);.  }.  sql
b850: 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
b860: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
b870: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
b880: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
b890: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
b8a0: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
b8b0: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
b8c0: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
b8d0: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
b8e0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
b8f0: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
b900: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
b910: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
b920: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
b930: 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67  .**.** Might mig
b940: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
b950: 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
b960: 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
b970: 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54  than nPage..** T
b980: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  his can happen, 
b990: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  for example, if 
b9a0: 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69  we are in the mi
b9b0: 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 61  ddle of a transa
b9c0: 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68  ction.** which h
b9d0: 61 73 20 65 78 74 65 6e 64 65 64 20 74 68 65 20  as extended the 
b9e0: 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74 68  file size and th
b9f0: 65 20 6e 65 77 20 70 61 67 65 73 20 61 72 65 20  e new pages are 
ba00: 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a  still all held.*
ba10: 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  * in cache, then
ba20: 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
ba30: 44 41 54 45 20 64 6f 65 73 20 61 20 73 74 61 74  DATE does a stat
ba40: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  ement rollback. 
ba50: 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69   Some.** operati
ba60: 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
ba70: 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
ba80: 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 79 6f  t confused if yo
ba90: 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e  u try to.** trun
baa0: 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
bab0: 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
bac0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
bad0: 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a  currently is,.**
bae0: 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
baf0: 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
bb00: 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
bb10: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
bb20: 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20  the new.** file 
bb30: 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74  instead..*/.stat
bb40: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
bb50: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
bb60: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
bb70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bb80: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
bb90: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
bba0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70  R_EXCLUSIVE && p
bbb0: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
bbc0: 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63  ods ){.    i64 c
bbd0: 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
bbe0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
bbf0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
bc00: 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
bc10: 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
bc20: 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ewSize = pPager-
bc30: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
bc40: 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
bc50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
bc60: 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
bc70: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
bc80: 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
bc90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
bcb0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
bcc0: 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
bcd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bcf0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
bd00: 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65  , "", 1, newSize
bd10: 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
bd20: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
bd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bd40: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
bd50: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
bd60: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
bd70: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
bd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bd90: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
bda0: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
bdb0: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
bdc0: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
bdd0: 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ize is at least 
bde0: 61 73 20 62 69 67 20 61 73 20 74 68 65 20 73 65  as big as the se
bdf0: 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74  ctor size report
be00: 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33  ed.** by sqlite3
be10: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 20  OsSectorSize(). 
be20: 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63   The minimum sec
be30: 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31 32 2e  tor size is 512.
be40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
be50: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
be60: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
be70: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
be80: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
be90: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
bea0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
beb0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
bec0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
bed0: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
bee0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
bef0: 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
bf00: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
bf10: 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
bf20: 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63   yet, in whcih c
bf30: 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
bf40: 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
bf50: 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
bf60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
bf70: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
bf80: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
bf90: 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
bfa0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
bfb0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
bfc0: 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  512 ){.    pPage
bfd0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
bfe0: 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  512;.  }.}../*.*
bff0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
c000: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
c010: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
c020: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
c030: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
c040: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
c050: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
c060: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
c070: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c080: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
c090: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
c0a0: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
c0b0: 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
c0c0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
c0d0: 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
c0e0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
c0f0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
c100: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
c110: 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
c120: 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
c130: 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
c140: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
c150: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
c160: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
c170: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
c180: 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
c190: 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
c1a0: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
c1b0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
c1c0: 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
c1d0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
c1e0: 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
c1f0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
c200: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
c210: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
c220: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
c230: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
c240: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
c250: 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
c260: 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
c270: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
c280: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
c290: 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
c2a0: 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
c2b0: 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
c2c0: 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
c2d0: 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
c2e0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
c2f0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c300: 20 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a   the page case..
c310: 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20  **  (7)  4 byte 
c320: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c330: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c340: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
c350: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
c360: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
c370: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
c380: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
c390: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
c3a0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
c3b0: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e  nal.).**  (8)  N
c3c0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
c3d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c3e0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
c3f0: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
c400: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
c410: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
c420: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
c430: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
c440: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
c450: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
c460: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
c470: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
c480: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c490: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
c4a0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
c4b0: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
c4c0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20  UTF-8..**  (9)  
c4d0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
c4e0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
c4f0: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
c500: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
c510: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
c520: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
c530: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
c540: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
c550: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
c560: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
c570: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
c580: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
c590: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
c5a0: 20 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61   first 8 items a
c5b0: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
c5c0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
c5d0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
c5e0: 65 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65  e of the 9th ite
c5f0: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
c600: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
c610: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
c620: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
c630: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
c640: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
c650: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
c660: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
c670: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
c680: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
c690: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
c6a0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c6b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
c6c0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
c6d0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
c6e0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
c6f0: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
c700: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
c710: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
c720: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
c730: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
c740: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
c750: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
c760: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
c770: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
c780: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
c790: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
c7a0: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
c7b0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
c7c0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
c7d0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
c7e0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
c7f0: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
c800: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
c810: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
c820: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
c830: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
c840: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
c850: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
c860: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
c870: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
c880: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
c890: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
c8a0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
c8b0: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
c8c0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
c8d0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
c8e0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
c8f0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
c900: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
c910: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
c920: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
c930: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c940: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
c950: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
c960: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
c970: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
c980: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
c990: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
c9a0: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
c9b0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
c9c0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
c9d0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
c9e0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
c9f0: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
ca00: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
ca10: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
ca20: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
ca30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
ca40: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
ca50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
ca60: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
ca70: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
ca80: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
ca90: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
caa0: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
cab0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
cac0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
cad0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
cae0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
caf0: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
cb00: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
cb10: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
cb20: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
cb30: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
cb40: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
cb50: 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
cb60: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
cb70: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
cb80: 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cba0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
cbb0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
cbc0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
cbd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
cbf0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
cc00: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
cc10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cc20: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
cc30: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
cc40: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
cc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cc60: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
cc70: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
cc80: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cca0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
ccb0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
ccc0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
cce0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ccf0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
cd00: 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
cd10: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
cd20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
cd30: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cd40: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
cd50: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
cd60: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
cd70: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
cd80: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
cd90: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
cda0: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
cdb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cdc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
cdd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
cde0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
cdf0: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
ce00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ce10: 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
ce20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
ce30: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
ce40: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
ce50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
ce60: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
ce70: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
ce80: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
ce90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cea0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
ceb0: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
cec0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
ced0: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
cee0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
cef0: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
cf00: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
cf10: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
cf20: 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
cf30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
cf40: 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
cf50: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
cf60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
cf70: 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
cf80: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
cf90: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
cfa0: 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
cfb0: 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
cfc0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
cfd0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
cfe0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
cff0: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
d000: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
d010: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d020: 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
d030: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
d040: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
d050: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d060: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
d070: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
d080: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
d090: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
d0a0: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
d0b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
d0c0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d0d0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
d0e0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
d0f0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
d100: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
d110: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d120: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
d130: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
d140: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
d150: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d160: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
d170: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
d180: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
d190: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
d1a0: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
d1b0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
d1c0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
d1d0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
d1e0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
d1f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
d200: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
d210: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
d220: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
d230: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
d240: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d250: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
d260: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
d270: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d280: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
d290: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
d2a0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
d2b0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
d2c0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
d2d0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
d2e0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
d2f0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
d300: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
d310: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
d320: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
d330: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d340: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
d350: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
d360: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
d370: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
d380: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
d390: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
d3a0: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
d3b0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
d3c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
d3d0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
d3e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d3f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d400: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
d410: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
d420: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
d430: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d440: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
d450: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
d460: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
d470: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
d480: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
d490: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
d4a0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
d4b0: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
d4c0: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
d4d0: 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
d4e0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
d4f0: 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
d500: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
d510: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
d520: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
d530: 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
d540: 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
d550: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
d560: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
d570: 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
d580: 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
d590: 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
d5a0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
d5b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
d5c0: 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
d5d0: 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
d5e0: 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
d5f0: 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
d600: 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
d610: 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
d620: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d630: 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
d640: 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
d650: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
d660: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
d670: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
d680: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
d690: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
d6a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d6b0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
d6c0: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
d6d0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
d6e0: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
d6f0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
d700: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
d710: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
d720: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d730: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d740: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
d750: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
d760: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
d770: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
d780: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
d790: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d7a0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
d7b0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d7c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d7d0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
d7e0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
d7f0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
d800: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
d810: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
d820: 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
d830: 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
d840: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d850: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d860: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d870: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
d880: 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
d890: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d8a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d8b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d8c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
d8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
d8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d900: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
d910: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
d920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
d930: 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
d940: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
d950: 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
d960: 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20  e is probably.  
d970: 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67          ** going
d980: 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e 67   to end up being
d990: 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69 73   corrupt.  It is
d9a0: 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c 20   corrupt to us, 
d9b0: 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20 20  anyhow..        
d9c0: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
d9d0: 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74 6f   next process to
d9e0: 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20   come along can 
d9f0: 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20  fix it.....     
da00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
da10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
da20: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
da30: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
da40: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
da50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
da60: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
da70: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
da80: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
da90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
daa0: 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
dab0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
dac0: 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
dad0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
dae0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
daf0: 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
db00: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
db10: 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +1);.  }.  if( r
db20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
db30: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
db40: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
db50: 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
db60: 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20  ]!='\0');.  }.  
db70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
db80: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
db90: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dba0: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
dbb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
dbc0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
dbd0: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
dbe0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
dbf0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
dc00: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
dc10: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
dc20: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
dc30: 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
dc40: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a   zMaster);.  }..
dc50: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
dc60: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
dc70: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
dc80: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
dc90: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
dca0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
dcb0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
dcc0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
dcd0: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
dce0: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
dcf0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
dd00: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
dd10: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
dd20: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
dd30: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
dd40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
dd50: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
dd60: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
dd70: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
dd80: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
dd90: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
dda0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
ddb0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
ddc0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
ddd0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
dde0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ddf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
de00: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
de10: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
de20: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
de30: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
de40: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
de50: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
de60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
de70: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
de80: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
de90: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dea0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
deb0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
dec0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
ded0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
dee0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
def0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
df00: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
df10: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
df20: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
df30: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
df40: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
df50: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
df60: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
df70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
df80: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
df90: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
dfa0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
dfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
dfc0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
dfd0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dff0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e000: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
e010: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
e020: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65  nalOff;..  /* Se
e030: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
e040: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
e050: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
e060: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
e070: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
e080: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
e090: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
e0a0: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
e0b0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
e0c0: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
e0d0: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
e0e0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
e0f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
e100: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
e110: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
e120: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
e130: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
e140: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e150: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
e160: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
e170: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
e180: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
e190: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
e1a0: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
e1b0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
e1c0: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
e1d0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
e1e0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
e1f0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
e200: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e210: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
e220: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
e230: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
e240: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
e250: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
e260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
e270: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
e280: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
e290: 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
e2a0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
e2b0: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
e2c0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
e2d0: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
e2e0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
e2f0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
e300: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
e310: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
e320: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
e330: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
e340: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
e350: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
e360: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
e370: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
e380: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
e390: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
e3a0: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
e3b0: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
e3c0: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
e3d0: 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
e3e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
e3f0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
e400: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
e410: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
e420: 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
e430: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e440: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e450: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e460: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
e470: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e480: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
e490: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
e4a0: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
e4b0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
e4c0: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
e4d0: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
e4e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e4f0: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
e500: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
e510: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
e520: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
e530: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
e540: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
e550: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
e560: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
e570: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
e580: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
e590: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
e5a0: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
e5b0: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
e5c0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
e5d0: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
e5e0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
e5f0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
e600: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
e610: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
e620: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
e630: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
e640: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
e650: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e660: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
e670: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
e680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e690: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
e6a0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e6b0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e6c0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e6d0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
e6e0: 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
e6f0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e700: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e710: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e720: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
e730: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e740: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
e750: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
e760: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
e770: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
e780: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
e790: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
e7a0: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
e7b0: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
e7c0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
e7d0: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
e7e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e7f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e800: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e810: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e820: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
e830: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
e840: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
e850: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
e860: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
e870: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
e880: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
e890: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
e8a0: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
e8b0: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
e8c0: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
e8d0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
e8e0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
e8f0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
e900: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
e910: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e920: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
e930: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e940: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
e950: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e960: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
e970: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
e980: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
e990: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
e9a0: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
e9b0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
e9c0: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
e9d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e9e0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
e9f0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
ea00: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
ea10: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
ea20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
ea30: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
ea40: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
ea50: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
ea60: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
ea70: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
ea80: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
ea90: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
eaa0: 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
eab0: 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
eac0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
ead0: 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
eae0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
eaf0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
eb00: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
eb10: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
eb20: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
eb30: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
eb40: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
eb50: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
eb60: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
eb70: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
eb80: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
eb90: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
eba0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
ebb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
ebc0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
ebd0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
ebe0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
ebf0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
ec00: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
ec10: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
ec20: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
ec30: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
ec40: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
ec50: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
ec60: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ec70: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
ec80: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
ec90: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
eca0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
ecb0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
ecc0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
ecd0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
ece0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
ed00: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
ed10: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
ed20: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
ed30: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
ed40: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
ed50: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
ed60: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
ed70: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
ed80: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
ed90: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
eda0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
edb0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
edc0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
edd0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
ede0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
ee00: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
ee10: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
ee20: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
ee30: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
ee40: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
ee50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
ee60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
ee70: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
ee80: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
ee90: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
eea0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
eeb0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
eec0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
eed0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
eee0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
eef0: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
ef10: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
ef20: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
ef30: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
ef40: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ef50: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
ef60: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
ef70: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
ef80: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
ef90: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
efa0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
efb0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
efc0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
efd0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
efe0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
eff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f000: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
f010: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
f020: 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
f030: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
f040: 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
f050: 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
f060: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
f070: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
f080: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
f090: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
f0a0: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
f0b0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
f0c0: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
f0d0: 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
f0e0: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
f0f0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f100: 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
f110: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
f120: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
f130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f140: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
f150: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
f160: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
f170: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
f180: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
f190: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
f1a0: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
f1b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
f1c0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
f1d0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
f1e0: 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
f1f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
f200: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
f210: 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
f220: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
f230: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
f240: 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
f250: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f260: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
f270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
f280: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
f290: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
f2a0: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
f2b0: 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
f2c0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
f2d0: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
f2e0: 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
f2f0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73   is closed..*/.s
f300: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
f310: 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a  3PagerOpentemp(.
f320: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f330: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
f340: 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
f350: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
f360: 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
f370: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f380: 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
f390: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
f3a0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
f3b0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
f3c0: 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
f3d0: 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
f3e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
f3f0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
f400: 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
f410: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
f420: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
f430: 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
f440: 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
f450: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f460: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f470: 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
f480: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
f490: 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
f4a0: 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
f4b0: 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
f4c0: 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
f4d0: 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
f4e0: 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
f4f0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f500: 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
f510: 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
f520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
f530: 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
f540: 65 73 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72  ess(void *,PgHdr
f550: 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   *);../*.** Crea
f560: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
f570: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
f580: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
f590: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
f5a0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
f5b0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
f5c0: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
f5d0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
f5e0: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
f5f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
f600: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
f610: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
f620: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
f630: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
f640: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
f650: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
f660: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
f670: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
f680: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
f690: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
f6a0: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
f6b0: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
f6c0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
f6d0: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
f6e0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
f6f0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
f700: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
f710: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
f720: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
f730: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
f740: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
f750: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
f760: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
f770: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
f780: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
f790: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
f7a0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
f7b0: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
f7c0: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
f7d0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f7e0: 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
f7f0: 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
f800: 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
f810: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
f820: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
f830: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
f840: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
f850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f860: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
f870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
f880: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
f890: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
f8a0: 73 63 29 28 44 62 50 61 67 65 2a 29 2c 20 20 2f  sc)(DbPage*),  /
f8b0: 2a 20 50 61 67 65 20 64 65 73 74 72 75 63 74 6f  * Page destructo
f8c0: 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
f8d0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
f8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
f8f0: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
f900: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
f910: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
f920: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
f930: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
f940: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
f950: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
f960: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
f970: 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
f980: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
f990: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
f9a0: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
f9b0: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
f9c0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
f9d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f9e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
f9f0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
fa00: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
fa10: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
fa20: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
fa30: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
fa40: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
fa50: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
fa60: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
fa70: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
fa80: 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
fa90: 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
faa0: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
fab0: 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 70 63  (pVfs);.  int pc
fac0: 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
fad0: 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a  e3PcacheSize();.
fae0: 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74    int szPageDflt
faf0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
fb00: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
fb10: 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
fb20: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   0;.  int nPathn
fb30: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ame = 0;..  /* T
fb40: 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
fb50: 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
fb60: 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
fb70: 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
fb80: 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
fb90: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
fba0: 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
fbb0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
fbc0: 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
fbd0: 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
fbe0: 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
fbf0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
fc00: 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
fc10: 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
fc20: 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
fc30: 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
fc40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
fc50: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
fc60: 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
fc70: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
fc80: 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
fc90: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
fca0: 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
fcb0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
fcc0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
fcd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fce0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  OMEM;.    }.#ifn
fcf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd00: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
fd10: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
fd20: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
fd30: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
fd40: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  = 1;.      zPath
fd50: 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  name[0] = 0;.   
fd60: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
fd70: 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73    {.      rc = s
fd80: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
fd90: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
fda0: 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
fdb0: 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
fdc0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
fdd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fde0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fdf0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
fe00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fe10: 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  }.    nPathname 
fe20: 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61  = strlen(zPathna
fe30: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
fe40: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
fe50: 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
fe60: 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
fe70: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
fe80: 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
fe90: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
fea0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
feb0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
fec0: 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20    pcacheSize    
fed0: 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
fee0: 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
fef0: 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
ff00: 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
ff10: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
ff20: 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
ff30: 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
ff40: 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20  OsFile * 3 +    
ff50: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
ff60: 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e  db and two journ
ff70: 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
ff80: 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   3*nPathname + 4
ff90: 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
ffa0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
ffb0: 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20  ctory, zJournal 
ffc0: 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
ffd0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
ffe0: 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
fff0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
10000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10010 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43   }.  pPager->pPC
10020 61 63 68 65 20 3d 20 28 50 43 61 63 68 65 20 2a  ache = (PCache *
10030 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
10040 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26 70 50  Ptr = ((u8 *)&pP
10050 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61 63 68  ager[1]) + pcach
10060 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  eSize;.  pPager-
10070 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
10080 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lags;.  pPager->
10090 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
100a0 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
100b0 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70  szOsFile*0];.  p
100c0 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73  Pager->stfd = (s
100d0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
100e0 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
100f0 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*1];.  pPager->
10100 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
10110 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
10120 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20  >szOsFile*2];.  
10130 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
10140 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72  e = (char*)&pPtr
10150 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
10160 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  2+journalFileSiz
10170 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  e];.  pPager->zD
10180 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
10190 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
101a0 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
101b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
101c0 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
101d0 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  tory[nPathname+1
101e0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
101f0 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20  s = pVfs;.  if( 
10200 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
10210 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
10220 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
10230 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
10240 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
10250 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
10260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
10270 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
10280 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
10290 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
102a0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
102b0 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e  {.    if( nPathn
102c0 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74  ame>(pVfs->mxPat
102d0 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22  hname - sizeof("
102e0 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20  -journal")) ){. 
102f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10300 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
10310 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
10320 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
10330 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
10340 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
10350 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
10360 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20  er->fd,.        
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
10390 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  s, &fout);.     
103a0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
103b0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
103c0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20  ADONLY);..      
103d0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
103e0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
103f0 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
10400 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
10410 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
10420 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
10430 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
10440 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
10450 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
10460 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
10470 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
10480 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
10490 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
104a0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
104b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
104c0 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  ,.      **    + 
104d0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
104e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
104f0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
10500 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
10510 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
10520 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
10530 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
10540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10560 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
10570 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65  .        int iSe
10580 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
10590 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
105a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
105b0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
105c0 6c 74 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  lt<iSectorSize )
105d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
105e0 67 65 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72  geDflt = iSector
105f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
10600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10610 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
10620 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
10630 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
10640 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
10650 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
10660 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
10670 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
10680 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
10690 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
106a0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
106b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
106c0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
106d0 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
106e0 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
106f0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
10700 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
10710 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
10720 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
10730 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
10740 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
10750 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
10760 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
10770 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
10780 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
10790 7c 28 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61  |(ii>>8)) ) szPa
107a0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
107b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
107c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
107d0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
107e0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
107f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
10800 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
10810 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
10820 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
10830 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10850 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62  }else if( !memDb
10860 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
10870 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
10880 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
10890 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
108a0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
108b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
108c0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
108d0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
108e0 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
108f0 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
10900 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
10910 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
10920 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
10930 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
10940 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
10950 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10960 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
10970 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
10980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10990 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
109a0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
109b0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a 50 61  3PageMalloc(szPa
109c0 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20  geDflt);.  }..  
109d0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
109e0 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
109f0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
10a00 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
10a10 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
10a20 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
10a30 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
10a40 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
10a50 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
10a60 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
10a70 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
10a80 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
10a90 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
10aa0 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
10ab0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10ac0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
10ad0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
10ae0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
10af0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
10b00 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
10b10 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
10b20 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
10b30 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  .  nExtra = FORC
10b40 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
10b50 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
10b60 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
10b70 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
10b80 6d 44 62 2c 20 78 44 65 73 63 2c 20 0a 20 20 20  mDb, xDesc, .   
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
10bb0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
10bc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
10bd0 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
10be0 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
10bf0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
10c00 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
10c10 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10c20 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
10c30 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
10c40 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
10c50 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
10c60 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
10c70 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
10c80 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
10c90 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
10ca0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
10cb0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
10cc0 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
10cd0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10ce0 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
10cf0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
10d00 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
10d10 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
10d20 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
10d30 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
10d40 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
10d50 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20  rnal[] */.  if( 
10d60 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
10d70 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
10d80 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
10d90 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
10da0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
10db0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
10dc0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
10dd0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
10de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
10df0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
10e00 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70  = 0;.  }..  /* p
10e10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10e20 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
10e30 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
10e40 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
10e50 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
10e60 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
10e70 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
10e80 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
10e90 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
10ea0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
10eb0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
10ec0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
10ed0 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
10ee0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10ef0 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
10f00 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73  er->pageSize = s
10f10 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20  zPageDflt;.  /* 
10f20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10f30 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
10f40 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
10f50 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10f60 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
10f70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
10f80 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
10f90 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
10fa0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
10fb0 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
10fc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
10fd0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
10fe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
10ff0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
11000 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
11010 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
11020 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
11030 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
11040 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
11050 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
11060 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
11070 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
11080 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
11090 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
110a0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
110b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
110c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
110d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
110e0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
110f0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
11100 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46  siveMode = tempF
11110 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
11120 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
11130 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
11140 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
11150 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
11160 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ync = 0; */.  pP
11170 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
11180 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11190 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  || !useJournal;.
111a0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
111b0 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f  nc = (pPager->no
111c0 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61  Sync?0:1);.  pPa
111d0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
111e0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
111f0 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  RMAL;.  /* pPage
11200 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
11210 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
11220 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
11230 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11240 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
11250 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
11260 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  = nExtra;.  pPag
11270 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
11280 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
11290 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
112a0 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
112b0 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
112c0 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c  Methods||memDb||
112d0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
112e0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
112f0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11300 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
11310 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
11320 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
11330 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
11340 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
11350 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
11360 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
11370 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
11380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11390 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
113a0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
113b0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
113c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
113d0 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
113e0 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
113f0 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
11400 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
11410 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
11420 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
11430 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
11440 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
11450 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
11460 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
11470 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
11480 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
11490 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
114a0 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
114b0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
114c0 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
114d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
114e0 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
114f0 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
11500 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
11510 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
11520 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
11530 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
11540 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
11550 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
11560 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
11570 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11580 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
11590 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
115a0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c  Reinit)(DbPage*,
115b0 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
115c0 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
115d0 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
115e0 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
115f0 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20   to *pPageSize. 
11600 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
11610 65 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a  ew page size is.
11620 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ** inappropriate
11630 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
11640 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
11650 69 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a  is set to that.*
11660 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  * value before r
11670 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
11680 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11690 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
116a0 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61  pPager, u16 *pPa
116b0 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  geSize){.  int r
116c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
116d0 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20   u16 pageSize = 
116e0 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
116f0 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
11700 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
11710 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
11720 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
11730 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
11740 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
11750 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
11760 67 65 53 69 7a 65 20 0a 20 20 20 26 26 20 28 70  geSize .   && (p
11770 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
11780 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
11790 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
117a0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
117b0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
117c0 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  e)==0 .  ){.    
117d0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
117e0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
117f0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
11800 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20  ;.    if( !pNew 
11810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11820 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
11840 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
11850 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
11860 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
11870 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ize;.      if( !
11880 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
11890 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
118a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
118b0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
118c0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
118d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
118e0 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
118f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
11900 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
11910 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
11920 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
11930 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69  }.  }.  *pPageSi
11940 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
11950 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
11960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11970 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
11980 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
11990 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
119a0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
119b0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
119c0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
119d0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
119e0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
119f0 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
11a00 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
11a10 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
11a20 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
11a30 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
11a40 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
11a50 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11a60 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
11a70 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
11a80 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
11a90 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
11aa0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
11ab0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
11ac0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
11ad0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
11ae0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
11af0 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
11b00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
11b10 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
11b20 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
11b30 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
11b40 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
11b50 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
11b60 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
11b70 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
11b80 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
11b90 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
11ba0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
11bb0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
11bc0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
11bd0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
11be0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11bf0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
11c00 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
11c10 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
11c20 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
11c30 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11c40 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
11c50 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
11c60 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
11c70 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
11c80 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
11c90 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
11ca0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
11cb0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11cc0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
11cd0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
11ce0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
11cf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
11d00 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
11d10 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
11d20 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
11d30 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
11d40 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
11d50 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
11d60 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
11d70 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
11d80 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
11d90 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
11da0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
11db0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
11dc0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
11dd0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
11de0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
11df0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
11e00 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
11e10 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
11e20 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
11e30 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
11e40 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11e50 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
11e60 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
11e70 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
11e80 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
11e90 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
11ea0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
11eb0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
11ec0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
11ed0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
11ee0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
11ef0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11f00 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
11f10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
11f20 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
11f30 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
11f40 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
11f50 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11f60 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
11f70 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
11f80 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
11f90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
11fa0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
11fb0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
11fc0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
11fd0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
11fe0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
11ff0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
12000 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
12010 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
12020 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
12030 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
12040 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
12050 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
12060 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
12070 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
12080 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
12090 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
120a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
120b0 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
120c0 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
120d0 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
120e0 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
120f0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
12100 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
12110 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
12120 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
12130 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
12140 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
12150 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
12160 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
12170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12180 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
12190 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
121a0 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
121b0 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
121c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
121d0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
121e0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
121f0 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67  sert(MEMDB||pPag
12200 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
12210 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
12220 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
12230 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
12240 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
12250 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
12260 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
12270 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12280 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
12290 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
122a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
122b0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
122c0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
122d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
122e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
122f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
12300 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
12310 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
12320 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
12330 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
12340 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
12350 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
12360 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
12370 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
12380 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
12390 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
123a0 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
123b0 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
123c0 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
123d0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
123e0 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
123f0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
12400 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
12410 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
12420 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
12430 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
12440 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
12450 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
12460 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12470 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
12480 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
12490 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b  e){.  i64 n = 0;
124a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
124b0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
124c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
124d0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
124e0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
124f0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
12500 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
12510 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
12520 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
12530 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
12540 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
12550 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
12560 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
12570 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
12580 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
12590 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
125a0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
125b0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
125c0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
125d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
125e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
125f0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
12600 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12610 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
12620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12630 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
12640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12650 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
12660 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
12670 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12680 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
12690 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
126a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
126b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
126c0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
126d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
126e0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
126f0 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
12700 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
12710 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
12720 20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e   n;.  }.  if( pn
12730 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
12740 61 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  age = n;.  }.  r
12750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
12770 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
12780 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
12790 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
127a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
127b0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
127c0 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
127d0 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
127e0 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
127f0 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
12800 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
12810 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
12820 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
12830 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12840 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
12850 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
12860 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
12870 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
12880 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
12890 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
128a0 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
128b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
128c0 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
128d0 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
128e0 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
128f0 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
12900 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
12910 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
12920 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
12930 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
12940 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
12950 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
12960 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
12970 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
12980 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
12990 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
129a0 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
129b0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
129c0 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
129d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
129e0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
129f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
12a00 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
12a10 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
12a20 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12a30 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
12a40 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
12a50 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
12a60 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
12a70 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
12a80 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
12a90 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
12aa0 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
12ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
12ac0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
12ad0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12ae0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
12af0 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
12b00 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
12b10 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
12b20 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
12b30 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
12b40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
12b50 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
12b60 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
12b70 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
12b80 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
12b90 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
12ba0 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
12bb0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12bc0 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
12bd0 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
12be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
12bf0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
12c00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
12c10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
12c20 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
12c30 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
12c40 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
12c50 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
12c60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
12c70 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
12c80 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
12c90 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
12ca0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12cb0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
12cc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12cd0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
12ce0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
12cf0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50  BusyHandler ) pP
12d00 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
12d10 65 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  er->nBusy = 0;. 
12d20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
12d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
12d40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
12d50 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
12d60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
12d70 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
12d80 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
12d90 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12da0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
12db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12dc0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12dd0 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
12de0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
12df0 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
12e00 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
12e10 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
12e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12e30 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
12e40 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
12e50 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
12e60 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
12e70 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
12e80 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
12e90 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
12ea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12eb0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
12ec0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12ed0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
12ee0 45 4d 44 42 20 29 3b 0a 0a 0a 20 20 73 71 6c 69  EMDB );...  sqli
12ef0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
12f00 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
12f10 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
12f20 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
12f30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
12f40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
12f50 67 65 3c 28 75 6e 73 69 67 6e 65 64 29 70 50 61  ge<(unsigned)pPa
12f60 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
12f70 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
12f80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
12f90 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
12fa0 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
12fb0 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
12fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12fd0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
12fe0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
12ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13010 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
13020 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
13030 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
13040 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
13050 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
13060 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13070 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
13080 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
13090 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
130a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
130b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
130c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
130d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
130e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
130f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13100 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
13110 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
13120 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
13130 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
13140 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
13150 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
13160 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
13170 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13180 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
13190 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
131a0 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
131b0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
131c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
131d0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
131e0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
131f0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
13200 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
13210 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
13220 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
13230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
13240 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
13250 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
13260 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
13270 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
13280 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
13290 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
132a0 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
132b0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
132c0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
132d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
132e0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
132f0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
13300 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
13310 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
13320 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
13330 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
13340 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
13350 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
13360 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
13370 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
13380 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
13390 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
133a0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
133b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
133c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
133d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
133e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
133f0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
13400 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55  Pager);.  pagerU
13410 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
13420 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62  (pPager);.  enab
13430 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
13440 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
13450 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
13460 6f 63 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  oc();.  PAGERTRA
13470 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
13480 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
13490 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
134a0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
134b0 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61 67  ger)).  if( pPag
134c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
134d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
134e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
134f0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
13500 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13510 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13520 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  l);.  sqlite3Bit
13530 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13540 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
13550 63 6b 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ck);.  if( pPage
13560 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
13570 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13580 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
13590 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
135a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
135b0 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
135c0 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
135d0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
135e0 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
135f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13600 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
13610 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
13620 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
13630 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
13640 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
13650 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
13660 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13670 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
13680 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
13690 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
136a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
136b0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
136c0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
136d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
136e0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
136f0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
13700 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
13710 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
13720 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
13730 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
13740 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
13750 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
13760 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
13770 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
13780 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
13790 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
137a0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
137b0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
137c0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
137d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
137e0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
137f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
13800 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
13810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13820 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
13830 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
13840 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
13850 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
13860 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
13870 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
13880 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
13890 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
138a0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
138b0 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
138c0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
138d0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
138e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
138f0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
13900 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
13910 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
13920 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13930 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
13940 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
13950 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
13960 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
13970 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
13980 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
13990 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
139a0 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
139b0 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
139c0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
139d0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
139e0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
139f0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
13a00 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
13a10 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
13a20 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
13a30 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
13a40 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
13a50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
13a60 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
13a70 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
13a80 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
13a90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
13aa0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
13ab0 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
13ac0 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
13ad0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
13ae0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
13af0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
13b00 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
13b10 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
13b20 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
13b30 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
13b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
13b50 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
13b60 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
13b70 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
13b80 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
13b90 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
13ba0 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20  ure, so no sync 
13bb0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
13bc0 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
13bd0 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65  NTIAL flag is se
13be0 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73  t for the persis
13bf0 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68  tent media on wh
13c00 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ich.** the datab
13c10 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74  ase is stored, t
13c20 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20  hen OsSync() is 
13c30 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  never called on 
13c40 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
13c50 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ile. In this cas
13c60 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  e all that is re
13c70 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70 64  quired is to upd
13c80 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
13c90 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75  ld in.** the jou
13ca0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a  rnal header..**.
13cb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13cc0 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
13cd0 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
13ce0 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
13cf0 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
13d00 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
13d10 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
13d20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13d30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13d40 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
13d50 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
13d60 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
13d70 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
13d80 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
13d90 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
13da0 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
13db0 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
13dc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
13dd0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
13de0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13df0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ile ){.      int
13e00 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
13e10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13e20 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
13e30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e50 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69  Open );..      i
13e60 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
13e70 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
13e80 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
13e90 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
13ea0 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
13eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
13ec0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
13ed0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
13ee0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
13ef0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
13f00 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
13f10 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
13f20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
13f30 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
13f40 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
13f50 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
13f60 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
13f70 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
13f80 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
13f90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
13fa0 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
13fb0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
13fc0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
13fd0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
13fe0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
13ff0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
14000 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
14010 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
14020 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
14030 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
14040 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
14050 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
14060 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
14070 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
14080 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
14090 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
140a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
140b0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
140c0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
140d0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
140e0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
140f0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
14100 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
14110 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14120 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
14130 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
14140 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
14150 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
14160 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
14170 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14180 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
14190 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
141a0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
141b0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
141c0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
141d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
141e0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
141f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14200 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
14210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
14220 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
14230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
14240 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
14250 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
14260 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
14270 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
14280 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
14290 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
142a0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
142b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
142c0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
142d0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
142e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
142f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14300 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
14310 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
14320 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
14330 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
14340 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
14350 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14360 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
14370 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
14380 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
14390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
143a0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
143b0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
143c0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
143d0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
143e0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
143f0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
14400 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
14410 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
14420 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
14430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14440 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
14450 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
14460 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
14470 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14480 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
14490 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
144a0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
144b0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
144c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
144d0 65 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  etFlags(pPager->
144e0 70 50 43 61 63 68 65 2c 20 7e 50 47 48 44 52 5f  pPCache, ~PGHDR_
144f0 4e 45 45 44 5f 53 59 4e 43 2c 20 30 29 3b 0a 20  NEED_SYNC, 0);. 
14500 20 20 20 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74     /* lruListSet
14510 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
14520 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66  er); */.  }..#if
14530 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
14540 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
14550 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
14560 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
14570 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
14580 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
14590 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
145a0 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
145b0 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
145c0 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
145d0 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
145e0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
145f0 65 41 73 73 65 72 74 46 6c 61 67 73 28 70 50 61  eAssertFlags(pPa
14600 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c  ger->pPCache, 0,
14610 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
14620 29 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  );.    /* assert
14630 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
14640 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
14650 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
14660 3b 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ; */.  }.#endif.
14670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14680 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
14690 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
146a0 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
146b0 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
146c0 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
146d0 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
146e0 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
146f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14700 20 4e 6f 20 63 61 6c 6c 73 20 61 72 65 20 6d 61   No calls are ma
14710 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  de.** to the pag
14720 65 2d 63 61 63 68 65 20 74 6f 20 6d 61 72 6b 20  e-cache to mark 
14730 74 68 65 20 70 61 67 65 73 20 61 73 20 63 6c 65  the pages as cle
14740 61 6e 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  an. It is the re
14750 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
14760 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14770 20 75 73 65 20 50 63 61 63 68 65 43 6c 65 61 6e   use PcacheClean
14780 41 6c 6c 28 29 20 6f 72 20 50 63 61 63 68 65 4d  All() or PcacheM
14790 61 6b 65 43 6c 65 61 6e 28 29 20 74 6f 20 6d 61  akeClean() to ma
147a0 72 6b 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  rk.** the pages 
147b0 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
147c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
147d0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
147e0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
147f0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
14800 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
14810 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
14830 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
14840 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
14850 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
14860 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
14870 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
14880 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
14890 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
148a0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
148b0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
148c0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
148d0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
148e0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
148f0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
14900 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
14910 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
14920 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
14930 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
14940 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
14950 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
14960 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14970 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
14980 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
14990 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
149a0 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
149b0 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
149c0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
149d0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
149e0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
149f0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
14a00 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
14a10 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
14a20 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
14a30 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
14a40 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
14a50 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
14a60 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
14a70 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
14a80 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
14a90 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
14aa0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14ab0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
14ac0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
14ad0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
14ae0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
14af0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
14b00 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
14b10 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
14b20 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
14b30 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
14b40 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
14b50 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
14b60 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
14b70 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
14b80 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
14b90 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
14ba0 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
14bb0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
14bc0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
14bd0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
14be0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
14bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14c00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14c10 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
14c20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a  pList ){..    /*
14c30 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
14c40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
14c50 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
14c60 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  w. */.    if( !p
14c70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
14c80 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ods ){.      ass
14c90 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70  ert(pPager->temp
14ca0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20  File);.      rc 
14cb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14cc0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
14cd0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
14ce0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
14cf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
14d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
14d10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
14d20 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
14d30 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
14d40 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
14d50 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
14d60 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
14d70 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
14d80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
14d90 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
14da0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
14db0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
14dc0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
14dd0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
14de0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
14df0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
14e00 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
14e10 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
14e20 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
14e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
14e40 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
14e50 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
14e60 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
14e70 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73  4 offset = (pLis
14e80 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  t->pgno-1)*(i64)
14e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14ea0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
14eb0 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ata = CODEC2(pPa
14ec0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
14ed0 61 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  a, pList->pgno, 
14ee0 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
14ef0 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20  RACE4("STORE %d 
14f00 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
14f10 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
14f20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
14f30 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14f40 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
14f50 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a  gehash(pList));.
14f60 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14f70 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
14f80 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
14f90 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
14fa0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
14fb0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
14fc0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
14fd0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
14fe0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
14ff0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
15000 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
15010 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
15020 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
15030 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
15040 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
15050 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15060 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15070 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
15080 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
15090 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
150a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
150b0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
150c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
150d0 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
150e0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
150f0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
15100 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
15110 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
15120 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69   ) return rc;.#i
15130 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
15140 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
15150 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
15160 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
15170 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
15180 2f 2a 20 6d 61 6b 65 43 6c 65 61 6e 28 70 4c 69  /* makeClean(pLi
15190 73 74 29 3b 20 2a 2f 0a 20 20 20 20 70 4c 69 73  st); */.    pLis
151a0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
151b0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 73 71 6c  y;.  }..  /* sql
151c0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
151d0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
151e0 68 65 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e  he); */.  return
151f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15200 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15210 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
15220 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
15230 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
15240 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
15250 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
15260 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
15270 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
15280 75 72 67 65 61 62 6c 65 20 50 61 67 65 72 20 0a  urgeable Pager .
15290 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
152a0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
152b0 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67  s to make a sing
152c0 6c 65 20 64 69 72 74 79 20 70 61 67 65 20 74 68  le dirty page th
152d0 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74  at has no.** out
152e0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
152f0 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78 69 73  ces (if one exis
15300 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74 68 61  ts) clean so tha
15310 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 63 79  t it can be recy
15320 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  cled .** by the 
15330 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f  pcache layer..*/
15340 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15350 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
15360 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
15370 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15380 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
15390 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
153a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
153b0 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20  >doNotSync ){.  
153c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
153d0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
153e0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
153f0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 69  HDR_DIRTY );.  i
15400 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15410 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
15420 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
15430 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
15440 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20  YNC ){.      rc 
15450 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
15460 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
15470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15480 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
15490 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21  nc && .        !
154a0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
154b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
154c0 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
154d0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
154e0 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20  PEND).      ){. 
154f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
15500 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
15510 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
15520 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
15530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
15560 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
15570 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
15580 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
15590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
155a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
155b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
155c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
155d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
155e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
155f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
15600 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
15610 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
15620 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
15630 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
15640 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
15650 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
15660 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
15670 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
15680 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
15690 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
156a0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
156b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
156c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
156d0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
156e0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
156f0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
15700 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
15710 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
15720 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
15730 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
15740 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
15750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
15760 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  *.** Return nega
15770 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74  tive if unable t
15780 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
15790 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f  status of the jo
157a0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
157b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
157c0 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ot open the jour
157d0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  nal file to exam
157e0 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65  ine its.** conte
157f0 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  nt.  Hence, the 
15800 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
15810 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
15820 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  f a master.** jo
15830 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
15840 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
15850 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20  , and hence not 
15860 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74  be hot.  Or.** t
15870 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
15880 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62   journal might b
15890 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54  e zeroed out.  T
158a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
158b0 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72  oes not discover
158c0 20 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20   these cases of 
158d0 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61  a non-hot journa
158e0 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f  l - if the.** jo
158f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
15900 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70  s and is not emp
15910 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ty this routine 
15920 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73  assumes it.** is
15930 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72   hot.  The pager
15940 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
15950 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
15960 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f  r that the.** jo
15970 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
15980 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
15990 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   will no-op..*/.
159a0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
159b0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
159c0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
159d0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
159e0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
159f0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
15a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15a10 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20  .  int exists;. 
15a20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61   int locked;.  a
15a30 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
15a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15a50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
15a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15a70 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15a80 64 73 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73  ds );.  *pExists
15a90 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
15aa0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
15ab0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15ac0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
15ad0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
15ae0 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
15af0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
15b00 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ts ){.    rc = s
15b10 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
15b20 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
15b30 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
15b40 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15b50 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
15b60 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  s && !locked ){.
15b70 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
15b80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15b90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15ba0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
15bb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15bc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28  E_OK ){.     if(
15bd0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
15be0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
15bf0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
15c00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
15c10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15c20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
15c30 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15c40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15c50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
15c60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
15c70 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
15c80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15c90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15ca0 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
15cb0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15cc0 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
15cd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
15ce0 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
15cf0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
15d00 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
15d10 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
15d20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15d30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
15d40 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
15d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15d60 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
15d70 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
15d80 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
15d90 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
15da0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
15db0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15dc0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
15dd0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15de0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50  ze, offset);.  P
15df0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
15e00 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
15e10 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
15e20 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
15e30 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
15e40 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
15e50 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
15e60 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
15e70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15e80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15e90 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
15ea0 61 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  a)[24],.        
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
15ee0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
15ef0 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
15f00 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
15f10 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
15f20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
15f30 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
15f40 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
15f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15f60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
15f70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67  , pPg->pgno, pag
15f80 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
15f90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15fa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
15fb0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15fc0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
15fd0 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
15fe0 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
15ff0 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
16000 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
16010 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
16020 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
16030 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
16040 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
16050 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16060 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
16070 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
16080 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
16090 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
160a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
160b0 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
160c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
160d0 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
160e0 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
160f0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
16100 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
16110 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
16120 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
16130 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
16140 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16160 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30  isErrorReset = 0
16170 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
16180 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16190 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
161a0 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
161b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
161c0 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
161d0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
161e0 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
161f0 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
16200 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
16210 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
16220 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
16230 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
16240 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
16250 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
16260 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
16270 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
16280 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
16290 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
162a0 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
162b0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
162c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
162d0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
162e0 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69  Code .  ){.    i
162f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
16300 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
16310 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
16320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
16330 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
16340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
16350 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
16360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16370 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
16380 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
16390 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
163a0 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
163b0 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
163c0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
163d0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
163e0 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
163f0 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
16400 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
16410 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
16420 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
16430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
16440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
16450 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
16460 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
16470 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
16480 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
16490 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
164a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
164b0 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
164c0 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
164d0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
164e0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
164f0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
16500 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
16510 72 6e 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  rnal;.      asse
16520 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
16530 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
16540 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
16550 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
16560 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
16570 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
16580 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16590 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
165a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
165b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
165c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
165d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
165e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
165f0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CK );.          
16600 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16610 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16630 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16640 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
16650 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
16660 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
16670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
16680 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
16690 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
166a0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
166b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
166c0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
166d0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
166e0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
166f0 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
16700 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f       if( !isErro
16710 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
16720 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
16730 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
16740 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
16750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16770 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
16780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16790 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 45   }.      if( isE
167a0 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
167b0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
167c0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
167d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
167e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
167f0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
16800 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20  t it is.        
16810 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
16820 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
16830 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
16840 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
16850 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45  the.        ** E
16860 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
16870 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
16880 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
16890 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
168a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
168b0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
168c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
168d0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
168e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
168f0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
16900 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
16910 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
16920 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
16930 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e          ** back.
16940 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
16950 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
16960 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
16970 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16980 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
16990 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
169a0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
169b0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
169c0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
169d0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
169e0 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
169f0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
16a00 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16a10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
16a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16a30 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16a40 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
16a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
16a60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16a70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16a80 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16a90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
16ac0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16ad0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
16ae0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
16af0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16b00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
16b10 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
16b20 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
16b30 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
16b40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16b50 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
16b60 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
16b70 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
16b80 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
16b90 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
16ba0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
16bb0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
16bc0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
16bd0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
16be0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
16bf0 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
16c00 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
16c10 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
16c20 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
16c30 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
16c40 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
16c50 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
16c60 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
16c70 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
16c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16c90 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
16ca0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t && pPager->jou
16cb0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  rnalOpen==0 ){. 
16cc0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73           int res
16cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16ce0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
16cf0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
16d00 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
16d10 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
16d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16d40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
16d50 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
16d60 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
16d70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
16d80 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
16d90 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16da0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
16db0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
16dc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16dd0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16de0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16df0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16e00 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
16e10 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
16e20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
16e30 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
16e40 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
16e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
16e60 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
16e70 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
16e80 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51       if( fout&SQ
16e90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16ea0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
16eb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16ec0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16ee0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
16ef0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
16f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16f30 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
16f40 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
16f50 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
16f60 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
16f70 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
16f80 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
16f90 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
16fa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16fb0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
16fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
16fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17000 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
17010 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
17020 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20  TE_IOERR_UNLOCK 
17030 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72  .           && r
17040 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
17050 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 20  NOMEM .         
17060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17070 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17080 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17090 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
170a0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
170b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
170c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
170d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
170e0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
170f0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
17100 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
17110 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
17120 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
17130 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
17140 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
17150 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
17160 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
17170 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
17180 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
17190 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
171a0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
171b0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
171c0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
171d0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
171e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
171f0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
17200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17220 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
17230 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
17240 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
17250 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
17260 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
17270 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17280 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
17290 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
172a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
172b0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
172c0 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
172d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
172e0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
172f0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
17300 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
17310 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
17320 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
17330 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
17340 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
17350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17360 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
17370 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
17380 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
17390 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
173a0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
173b0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
173c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
173d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
173e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
173f0 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
17400 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
17410 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
17420 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
17430 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
17440 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
17450 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
17460 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
17470 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
17480 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
17490 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
174a0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
174b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
174c0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
174d0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
174e0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
174f0 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
17500 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
17510 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
17520 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
17530 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
17540 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
17550 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
17560 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
17570 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
17580 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
17590 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
175a0 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
175b0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
175c0 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
175d0 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
175e0 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
175f0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
17600 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
17610 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
17620 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
17630 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
17640 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
17650 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
17660 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
17670 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17680 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
17690 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
176a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
176b0 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  0);..        if(
176c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
176d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
176e0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
176f0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  de;.          go
17700 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
17710 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
17720 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17730 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
17740 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
17750 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17760 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
17770 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
17780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17790 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
177a0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
177b0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
177c0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
177d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
177e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
177f0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17820 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
17830 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
17840 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
17850 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17860 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
17870 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17880 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
17890 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
178a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
178b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
178c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
178d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
178e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
178f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
17900 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
17910 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
17920 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17930 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
17940 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
17950 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
17960 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
17970 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64    }.  }.. failed
17980 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
17990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
179a0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
179b0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78  s a no-op for ex
179c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
179d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
179e0 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ases. */.    pag
179f0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
17a00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17a10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
17a20 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
17a30 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
17a40 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
17a50 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
17a60 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
17a70 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
17a80 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
17a90 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
17aa0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
17ab0 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
17ac0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
17ad0 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
17ae0 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
17af0 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
17b00 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
17b10 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
17b20 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
17b30 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
17b40 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
17b50 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
17b60 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
17b70 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
17b80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
17b90 45 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69  ED_READ ){.    i
17ba0 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
17bb0 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
17bc0 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
17bd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17bf0 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
17c00 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
17c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17c30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17c40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17c50 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
17c60 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
17c70 61 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20  ached zero, and 
17c80 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
17c90 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c   in the.** middl
17ca0 65 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61  e of a write tra
17cb0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e  nsaction or open
17cc0 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ed in exclusive 
17cd0 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e  mode, unlock it.
17ce0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
17cf0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
17d00 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
17d10 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
17d20 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
17d30 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
17d40 65 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21  e)==0).    && (!
17d50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17d60 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
17d70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
17d80 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
17d90 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
17da0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
17db0 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67  /*.** Drop a pag
17dc0 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  e from the cache
17dd0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63   using sqlite3Pc
17de0 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a  acheDrop()..**.*
17df0 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  * If this means 
17e00 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  there are now no
17e10 20 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65   pages with refe
17e20 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20  rences to them, 
17e30 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
17e40 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
17e50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17e60 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  e is removed..*/
17e70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
17e80 65 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67  erDropPage(DbPag
17e90 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
17ea0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
17eb0 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
17ec0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
17ed0 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  ;.  pagerUnlockI
17ee0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
17ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
17f00 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
17f10 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
17f20 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
17f30 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
17f40 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
17f50 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
17f60 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
17f70 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
17f80 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
17f90 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
17fa0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
17fb0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
17fc0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
17fd0 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
17fe0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
17ff0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
18000 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
18010 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
18020 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
18030 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
18040 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
18050 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
18060 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
18070 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
18080 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
18090 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
180a0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
180b0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
180c0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
180d0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
180e0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
180f0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
18100 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
18110 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
18120 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
18130 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
18140 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18150 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
18160 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
18170 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
18180 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18190 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
181a0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
181b0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
181c0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
181d0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
181e0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
181f0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
18200 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
18210 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
18220 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
18230 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
18240 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
18250 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
18260 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
18270 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
18280 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
18290 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
182a0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
182b0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
182c0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
182d0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
182e0 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
182f0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
18300 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
18310 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
18320 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
18330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
18340 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
18350 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
18360 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
18370 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
18380 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
18390 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
183a0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
183b0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
183c0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
183d0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
183e0 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
183f0 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
18400 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
18410 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
18420 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
18430 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
18440 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
18450 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
18460 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
18470 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
18480 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
18490 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
184a0 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
184b0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
184c0 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
184d0 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
184e0 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
184f0 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
18500 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
18510 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18520 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
18530 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
18540 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
18550 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
18560 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
18570 20 70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20   pagerAcquire(. 
18580 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
18590 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
185a0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
185b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
185c0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
185d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
185e0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
185f0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
18600 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
18610 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18620 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
18630 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
18640 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
18650 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
18660 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
18670 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
18680 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
18690 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
186a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
186b0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
186c0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
186d0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
186e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
186f0 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67  >0 .       || pg
18700 6e 6f 3d 3d 31 20 0a 20 20 29 3b 0a 0a 20 20 2f  no==1 .  );..  /
18710 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
18720 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
18730 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
18740 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
18750 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
18760 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
18770 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
18780 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
18790 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
187a0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
187b0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
187c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
187d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
187e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
187f0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
18800 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
18810 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
18820 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
18830 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
18840 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
18850 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Page = 0;..  /* 
18860 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
18870 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
18880 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
18890 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
188a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
188b0 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
188c0 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
188d0 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
188e0 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
188f0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
18900 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
18910 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
18920 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
18940 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
18950 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18960 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
18970 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  K );..  rc = sql
18980 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
18990 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
189a0 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b   pgno, 1, &pPg);
189b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
189c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
189d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
189e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
189f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
18a00 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
18a10 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
18a20 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
18a30 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
18a40 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
18a50 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d     */.    int nM
18a60 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ax;.    PAGER_IN
18a70 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
18a80 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
18a90 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
18aa0 20 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76   if( sqlite3Bitv
18ab0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
18ac0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
18ad0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66   ){.      pPg->f
18ae0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e  lags |= PGHDR_IN
18af0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a  _JOURNAL;.    }.
18b00 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
18b10 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
18b20 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a 20 20 20  r->nExtra);..   
18b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18b40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
18b50 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
18b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18b70 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
18b80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
18b90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18ba0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
18bb0 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
18bc0 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f  o || MEMDB || no
18bd0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
18be0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
18bf0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
18c00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18c10 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18c30 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
18c40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
18c50 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
18c60 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18c70 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
18c80 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nt ){.        pP
18c90 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
18ca0 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
18cb0 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
18cc0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
18cd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
18ce0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
18cf0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
18d00 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67  Page(pPager, pPg
18d10 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
18d20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
18d40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
18d50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ){.        /* sq
18d60 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
18d70 70 50 67 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  pPg); */.       
18d80 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 70   pagerDropPage(p
18d90 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
18da0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18db0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
18dc0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
18dd0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
18de0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
18df0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
18e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18e10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
18e20 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
18e30 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
18e40 61 73 73 65 72 74 28 73 71 6c 69 74 65 33 50 63  assert(sqlite3Pc
18e50 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
18e60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
18e70 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20  || pgno==1);.   
18e80 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
18e90 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69  er->nHit);.    i
18ea0 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  f( !noContent ){
18eb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
18ec0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
18ed0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
18ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18ef0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
18f00 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
18f10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18f20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 50     }.  }..  *ppP
18f30 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
18f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18f50 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  ..int sqlite3Pag
18f60 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
18f70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
18f80 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
18f90 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
18fa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
18fb0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
18fc0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
18fd0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
18fe0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
18ff0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
19000 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
19010 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
19020 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
19030 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
19040 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
19050 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
19060 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
19070 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63  ;.  rc = pagerAc
19080 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67  quire(pPager, pg
19090 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
190a0 6e 74 65 6e 74 29 3b 0a 20 20 72 65 74 75 72 6e  ntent);.  return
190b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
190c0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
190d0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
190e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
190f0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
19100 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
19110 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
19120 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
19130 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
19140 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
19150 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
19160 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
19170 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
19180 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
19190 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
191a0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
191b0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
191c0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
191d0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
191e0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
191f0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
19200 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
19210 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
19220 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
19230 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
19240 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19250 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
19260 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
19270 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
19280 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
19290 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
192a0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
192b0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
192c0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
192d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
192e0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
192f0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
19300 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
19310 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
19320 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  K).   && (pPager
19330 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
19340 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
19350 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
19360 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73  FULL).  ){.    s
19370 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
19380 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
19390 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
193a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
193b0 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
193c0 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
193d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
193e0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
193f0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
19400 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
19410 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
19420 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
19430 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
19440 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
19450 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
19460 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
19470 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
19480 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
19490 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
194a0 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
194b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
194c0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
194d0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50  if( pPg ){.    P
194e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
194f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
19500 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
19510 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70  ease(pPg);.    p
19520 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
19530 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ed(pPager);.  }.
19540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19550 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
19560 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
19570 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
19580 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
19590 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
195a0 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
195b0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
195c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
195d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
195e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
195f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19600 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
19610 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
19620 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
19630 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
19640 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
19650 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
19660 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19670 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
19680 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
19690 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
196a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
196b0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  .  int flags = (
196c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
196d0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
196e0 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
196f0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
19700 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ..  int rc;.  as
19710 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
19720 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19730 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
19740 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
19750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
19760 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
19770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
19780 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
19790 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
197a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
197b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
197c0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
197d0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
197e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
197f0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
19800 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
19810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19820 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
19830 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
19840 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
19850 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19860 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
19870 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
19880 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
19890 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
198a0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
198b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
198c0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
198d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
198e0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
198f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
19900 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
19910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
19920 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72 63 20  IC_WRITE.    rc 
19930 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
19940 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 56  Open(.        pV
19950 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
19960 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
19970 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
19980 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
19990 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20  .    );.#else.  
199a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
199b0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
199c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
199d0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
199e0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
199f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19a00 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19a10 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
19a20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
19a30 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
19a40 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
19a50 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
19a60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
19a70 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21  = 0;.    if( rc!
19a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19aa0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
19ab0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
19ac0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
19ad0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
19ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
19af0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
19b00 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d  n_journal;.    }
19b10 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
19b20 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
19b30 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19b40 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
19b50 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
19b60 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19b70 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
19b80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
19b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
19ba0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
19bb0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19bc0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19bd0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
19be0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
19bf0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
19c00 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
19c10 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
19c20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
19c30 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
19c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19c60 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
19c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19c80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
19c90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
19ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
19cb0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
19cc0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
19cd0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
19ce0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
19cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19d00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19d10 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
19d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
19d30 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19d40 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
19d50 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
19d60 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19d70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
19d80 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
19d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19da0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
19db0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
19dc0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
19dd0 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
19de0 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
19df0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
19e00 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
19e10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
19e20 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
19e30 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
19e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
19e50 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
19e60 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
19e70 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
19e80 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
19e90 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
19ea0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
19eb0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
19ec0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
19ed0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
19ee0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
19ef0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
19f00 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
19f10 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
19f20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19f30 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
19f40 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
19f50 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
19f60 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
19f70 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
19f80 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
19f90 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
19fa0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
19fb0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
19fc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19fd0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
19fe0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
19ff0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
1a000 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
1a010 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
1a020 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
1a030 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
1a040 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1a050 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
1a060 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
1a070 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
1a080 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
1a090 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1a0a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1a0b0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
1a0c0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
1a0d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
1a0e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1a0f0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1a100 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1a110 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1a120 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1a130 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1a140 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1a150 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1a160 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1a170 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1a180 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1a190 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1a1a0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1a1b0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1a1c0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1a1d0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1a1e0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1a1f0 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1a200 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1a210 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1a220 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1a230 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1a240 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1a250 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1a260 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1a270 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1a280 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1a290 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1a2a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a2b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1a2c0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1a2d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1a2e0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1a2f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a300 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1a310 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1a320 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1a330 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1a340 73 71 6c 69 74 65 33 50 63 61 63 68 65 41 73 73  sqlite3PcacheAss
1a350 65 72 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d  ertFlags(pPager-
1a360 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50 47 48  >pPCache, 0, PGH
1a370 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  DR_IN_JOURNAL);.
1a380 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1a390 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1a3a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1a3b0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
1a3c0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a3d0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1a3e0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1a3f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a400 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1a410 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
1a420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1a430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a440 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1a450 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
1a460 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
1a470 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
1a480 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a490 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1a4a0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1a4b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
1a4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a4d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1a4f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1a500 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
1a510 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
1a520 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
1a530 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
1a540 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1a550 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
1a560 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1a570 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
1a580 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20  mpFile.         
1a590 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
1a5a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1a5b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1a5c0 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  F ){.        rc 
1a5d0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1a5e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1a5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a600 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1a610 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1a620 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a630 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1a640 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1a650 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1a660 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1a670 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
1a680 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1a690 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1a6a0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1a6b0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1a6c0 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1a6d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1a6e0 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1a6f0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1a700 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1a710 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1a720 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
1a730 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1a740 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
1a750 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
1a760 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
1a770 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
1a780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1a790 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1a7a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1a7b0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1a7c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a7d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1a7e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1a7f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1a800 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50  ager, 0);.    pP
1a810 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1a820 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1a830 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e  Create( pPager->
1a840 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  dbSize );.    if
1a850 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( !pPager->pInJo
1a860 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1a870 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a880 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a890 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1a8a0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1a8b0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1a8c0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1a8d0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1a8e0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1a8f0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1a900 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1a910 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1a920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1a930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a940 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1a950 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69  ge dirty.  Set i
1a960 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e  ts dirty flag an
1a970 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  d add it to the 
1a980 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69  dirty.** page li
1a990 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1a9a0 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48  id makeDirty(PgH
1a9b0 64 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  dr *pPg){.  sqli
1a9c0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
1a9d0 74 79 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ty(pPg);.}../*.*
1a9e0 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c  * Make a page cl
1a9f0 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20  ean.  Clear its 
1aa00 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65  dirty bit and re
1aa10 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
1aa20 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c  .** dirty page l
1aa30 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
1aa40 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
1aa50 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  Hdr *pPg){.  sql
1aa60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1aa70 65 61 6e 28 70 50 67 29 3b 0a 7d 0a 0a 0a 2f 2a  ean(pPg);.}.../*
1aa80 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
1aa90 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
1aaa0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
1aab0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1aac0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
1aad0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1aae0 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
1aaf0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
1ab00 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
1ab10 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
1ab20 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
1ab30 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1ab40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ab50 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
1ab60 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
1ab70 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
1ab80 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
1ab90 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1aba0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
1abb0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
1abc0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
1abd0 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
1abe0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1abf0 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
1ac00 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
1ac10 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
1ac20 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
1ac30 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
1ac40 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
1ac50 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
1ac60 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
1ac70 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1ac80 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
1ac90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1aca0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
1acb0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
1acc0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
1acd0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
1ace0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1acf0 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
1ad00 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
1ad10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
1ad20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
1ad30 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
1ad40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1ad50 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
1ad60 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
1ad70 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ad80 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
1ad90 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
1ada0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
1adb0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1adc0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
1add0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
1ade0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
1adf0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1ae00 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1ae10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ae20 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
1ae30 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
1ae40 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1ae50 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
1ae60 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1ae70 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1ae80 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
1ae90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1aea0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
1aeb0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1aec0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
1aed0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1aee0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1aef0 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
1af00 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1af10 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1af20 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
1af30 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
1af40 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
1af50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1af60 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
1af70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
1af80 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
1af90 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
1afa0 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
1afb0 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
1afc0 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
1afd0 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
1afe0 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
1aff0 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
1b000 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
1b010 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
1b020 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1b030 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
1b040 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
1b050 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
1b060 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
1b070 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
1b080 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
1b090 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
1b0a0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1b0b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1b0c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b0d0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1b0e0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
1b0f0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
1b100 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1b110 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1b120 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
1b130 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
1b140 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1b150 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
1b160 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
1b170 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  s&PGHDR_IN_JOURN
1b180 41 4c 29 0a 20 20 20 26 26 20 28 70 61 67 65 49  AL).   && (pageI
1b190 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
1b1a0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
1b1b0 6e 55 73 65 3d 3d 30 29 20 0a 20 20 29 7b 0a 20  nUse==0) .  ){. 
1b1c0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1b1d0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70  Cache = 1;.    p
1b1e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1b1f0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
1b200 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
1b210 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
1b220 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1b230 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
1b240 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
1b250 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b260 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
1b270 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
1b280 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
1b290 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
1b2a0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
1b2b0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
1b2c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1b2d0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
1b2e0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
1b2f0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
1b300 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1b310 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1b320 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1b330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b340 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
1b350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b380 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1b390 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1b3a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1b3b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1b3c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1b3d0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1b3e0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  al.          && 
1b3f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1b400 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1b410 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
1b420 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1b430 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1b440 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1b450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b460 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b470 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1b480 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
1b490 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
1b4a0 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
1b4b0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1b4c0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
1b4d0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
1b4e0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
1b4f0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1b500 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
1b510 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1b520 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
1b530 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
1b540 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
1b550 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
1b560 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1b570 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1b580 20 20 20 20 69 66 28 20 21 28 70 50 67 2d 3e 66      if( !(pPg->f
1b590 6c 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f  lags&PGHDR_IN_JO
1b5a0 55 52 4e 41 4c 29 20 26 26 20 28 70 50 61 67 65  URNAL) && (pPage
1b5b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1b5c0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
1b5d0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1b5e0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1b5f0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1b600 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1b610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
1b620 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
1b630 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1b640 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b650 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1b660 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b670 69 74 65 33 50 63 61 63 68 65 50 72 65 73 65 72  ite3PcachePreser
1b680 76 65 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  ve(pPg, 0);.    
1b690 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b6b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b6d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b6e0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
1b6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1b700 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20   *pData2;..     
1b710 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
1b720 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
1b730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b740 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
1b750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1b760 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
1b770 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
1b780 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1b790 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
1b7a0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1b7b0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1b7c0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1b7d0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
1b7e0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
1b7f0 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1b800 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1b810 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1b820 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
1b830 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
1b840 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
1b850 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
1b860 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
1b870 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
1b880 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
1b890 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
1b8a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1b8b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1b8d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1b8e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
1b8f0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1b900 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29  >journalOff + 4)
1b940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
1b950 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b960 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
1b970 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
1b980 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1b990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1b9b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1b9c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1b9d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b9e0 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1b9f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1ba00 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
1ba10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1ba30 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1ba40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1ba50 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1ba70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1ba80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ba90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1baa0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1bab0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1bac0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1bad0 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55  PAGERTRACE5("JOU
1bae0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
1baf0 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
1bb00 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1bb10 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1bb20 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1bb30 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
1bb40 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
1bb50 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1bb60 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
1bb70 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
1bb80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
1bb90 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1bba0 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
1bbb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1bbc0 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  The .          *
1bbd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1bbe0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1bbf0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1bc00 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  bove..          
1bc10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1bc20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bc30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1bc40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1bc50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1bc60 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
1bc70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1bc80 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1bc90 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1bca0 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
1bcb0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
1bcc0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
1bcd0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1bce0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1bcf0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1bd00 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1bd10 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1bd20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bd30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1bd40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1bd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1bd60 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1bd70 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
1bd80 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1bd90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bda0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bdb0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1bdc0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1bdd0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1bde0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1bdf0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1be00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
1be10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1be30 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1be40 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1be50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be60 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1be70 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1be90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1bea0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
1beb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bec0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1bed0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1bee0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1bef0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1bf00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1bf10 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1bf20 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  R_IN_JOURNAL;.  
1bf30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1bf40 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1bf50 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1bf60 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1bf70 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1bf80 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1bf90 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1bfa0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1bfb0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1bfc0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1bfd0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1bfe0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1bff0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1c000 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1c010 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1c020 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1c030 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1c040 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1c050 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1c060 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21  InUse .     && !
1c070 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
1c080 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69  pPg) .     && (i
1c090 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1c0a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
1c0b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1c0c0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
1c0d0 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41  &PGHDR_IN_JOURNA
1c0e0 4c 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  L) .            
1c0f0 20 20 20 20 20 7c 7c 20 28 69 6e 74 29 70 50 67       || (int)pPg
1c100 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1c110 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1c120 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1c130 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c140 69 74 65 33 50 63 61 63 68 65 50 72 65 73 65 72  ite3PcachePreser
1c150 76 65 28 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  ve(pPg, 1);.    
1c160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c180 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c1a0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
1c1b0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1c1c0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c1d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c1e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gno);.      }els
1c1f0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f  e{.        i64 o
1c200 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1c210 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67  stmtNRec*(4+pPag
1c220 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c230 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1c240 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1c250 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1c260 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1c270 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1c280 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64  its(pPager->stfd
1c290 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
1c2a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
1c2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c2c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c2d0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1c2e0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1c2f0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1c300 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
1c310 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  4);.        }.  
1c320 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c330 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1c340 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1c350 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c360 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c370 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c3b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c3c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1c3d0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  rt( pPager->pInS
1c3e0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1c3f0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
1c400 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
1c410 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
1c420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c430 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1c440 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1c450 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1c460 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1c470 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1c480 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
1c490 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
1c4a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
1c4b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
1c4c0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
1c4d0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1c4e0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
1c4f0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
1c500 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1c510 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1c520 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
1c530 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1c550 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1c560 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
1c570 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
1c580 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
1c590 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
1c5a0 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1c5b0 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
1c5c0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
1c5d0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1c5e0 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
1c5f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1c600 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1c610 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1c620 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
1c630 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
1c640 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
1c650 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
1c660 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
1c670 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
1c680 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
1c690 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
1c6a0 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
1c6b0 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
1c6c0 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
1c6d0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c6e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1c6f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
1c700 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1c710 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c720 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
1c730 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
1c740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c750 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
1c760 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
1c770 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c780 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
1c790 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
1c7a0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1c7b0 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
1c7c0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45  ize);..  if( !ME
1c7d0 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
1c7e0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
1c7f0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
1c800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1c810 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1c820 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
1c830 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
1c840 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
1c850 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1c860 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1c870 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1c880 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
1c890 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1c8a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c8b0 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
1c8c0 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
1c8d0 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
1c8e0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
1c8f0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
1c900 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1c910 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1c920 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1c930 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1c940 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1c950 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1c960 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1c970 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1c980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1c990 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1c9a0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1c9b0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
1c9c0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1c9d0 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
1c9e0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
1c9f0 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
1ca00 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
1ca10 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
1ca20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
1ca30 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
1ca40 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
1ca50 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
1ca60 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
1ca70 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1ca80 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1ca90 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
1caa0 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
1cab0 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
1cac0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
1cad0 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c  )) + 1;..    sql
1cae0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1caf0 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20  nt(pPager, (int 
1cb00 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a  *)&nPageCount);.
1cb10 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1cb20 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
1cb30 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
1cb40 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
1cb50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1cb60 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
1cb70 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
1cb80 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1cb90 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
1cba0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
1cbb0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1cbc0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
1cbd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1cbe0 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
1cbf0 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
1cc00 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
1cc10 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
1cc20 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
1cc30 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
1cc40 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1cc50 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
1cc60 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
1cc70 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
1cc80 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
1cc90 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
1cca0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
1ccb0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1ccc0 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
1ccd0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
1cce0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1ccf0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1cd00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cd10 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1cd20 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
1cd30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cd40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cd50 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1cd60 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1cd80 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
1cd90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
1cdb0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1cdc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1cde0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1cdf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ce00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1ce10 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
1ce20 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1ce30 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
1ce40 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1ce50 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1ce60 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1ce70 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
1ce80 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1ce90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1cea0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1ceb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1cec0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64    /* If the PgHd
1ced0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1cee0 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
1cef0 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
1cf00 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
1cf10 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
1cf20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
1cf30 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
1cf40 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
1cf50 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
1cf60 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
1cf70 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
1cf80 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
1cf90 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
1cfa0 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
1cfb0 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
1cfc0 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
1cfd0 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
1cfe0 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
1cff0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
1d000 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d010 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1d020 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a  if( needSync ){.
1d030 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1d040 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1d050 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1d060 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1d070 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1d080 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1d090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1d0a0 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1d0b0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1d0c0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1d0d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d0e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1d0f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1d100 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1d110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1d120 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1d130 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1d140 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1d150 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1d160 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1d170 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1d180 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d190 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d1a0 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1d1b0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1d1c0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1d1d0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1d1e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1d1f0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1d200 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1d210 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1d220 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1d230 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1d240 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1d250 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1d260 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1d270 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1d280 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1d290 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d2a0 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1d2b0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1d2c0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1d2d0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1d2e0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1d2f0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1d300 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1d310 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1d320 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1d330 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1d340 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1d350 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1d360 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
1d370 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
1d380 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
1d390 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
1d3a0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
1d3b0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1d3c0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
1d3d0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
1d3e0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
1d3f0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
1d400 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
1d410 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
1d420 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
1d430 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1d440 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
1d450 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
1d460 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1d470 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
1d480 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
1d490 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
1d4a0 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
1d4b0 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
1d4c0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
1d4d0 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
1d4e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1d4f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1d500 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
1d510 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
1d520 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
1d530 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
1d540 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1d550 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
1d560 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
1d570 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
1d580 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
1d590 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1d5a0 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
1d5b0 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
1d5c0 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
1d5d0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1d5e0 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
1d5f0 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
1d600 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
1d610 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
1d620 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
1d630 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
1d640 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1d650 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
1d660 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1d670 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
1d680 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
1d690 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1d6a0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1d6b0 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
1d6c0 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
1d6d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d6e0 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  Rollback() routi
1d6f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1d700 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ut because the.*
1d710 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
1d720 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1d730 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1d740 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a  be sure it gets.
1d750 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ** rolled back i
1d760 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73  n spite of the s
1d770 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d780 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
1d790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d7a0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
1d7b0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1d7c0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1d7d0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1d7e0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1d7f0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1d800 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20  .  if( MEMDB || 
1d810 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1d820 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1d830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d840 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d850 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1d860 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  ollback==0 ){.  
1d870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d880 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1d890 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
1d8a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71  aysRollback = sq
1d8b0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1d8c0 65 28 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  e(pPager->origDb
1d8d0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
1d8e0 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1d8f0 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
1d900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1d910 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1d920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
1d930 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1d940 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c  pAlwaysRollback,
1d950 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20   pPg->pgno);..  
1d960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d970 4b 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  K && (pPg->flags
1d980 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
1d990 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1d9a0 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
1d9b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1d9c0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1d9d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d9e0 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1d9f0 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1da00 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1da10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1da20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1da30 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1da40 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1da50 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1da60 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1da70 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1da80 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1da90 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1daa0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1dab0 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1dac0 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1dad0 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1dae0 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1daf0 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1db00 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1db10 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1db20 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1db30 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1db40 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1db50 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1db60 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1db70 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1db80 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1db90 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1dba0 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1dbb0 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1dbc0 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1dbd0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1dbe0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1dbf0 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1dc00 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1dc10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1dc20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1dc30 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
1dc40 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
1dc50 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1dc60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1dc70 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1dc80 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
1dc90 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1dca0 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67  pgno)).      pPg
1dcb0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
1dcc0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
1dcd0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1dce0 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
1dcf0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1dd00 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1dd10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
1dd20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1dd30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
1dd40 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1dd50 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1dd60 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
1dd70 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
1dd80 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1dd90 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
1dda0 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
1ddb0 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
1ddc0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1ddd0 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
1dde0 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
1ddf0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
1de00 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
1de10 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1de20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
1de30 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
1de40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1de50 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
1de60 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1de70 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
1de80 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1de90 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
1dea0 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
1deb0 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
1dec0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
1ded0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
1dee0 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
1def0 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
1df00 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
1df10 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
1df20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1df30 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
1df40 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
1df50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1df60 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
1df70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1df80 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1df90 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
1dfa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1dfb0 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
1dfc0 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
1dfd0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
1dfe0 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
1dff0 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
1e000 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  s the alwaysRoll
1e010 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e  back flag), then
1e020 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1e030 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1e040 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1e050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1e060 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  0 .   || sqlite3
1e070 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1e080 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
1e090 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20  ck, pPg->pgno). 
1e0a0 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
1e0b0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1e0c0 65 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e.  ){.    retur
1e0d0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1e0e0 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a   !MEMDB );    /*
1e0f0 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50   For a memdb, pP
1e100 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1e110 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f  n is always 0 */
1e120 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e130 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1e140 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20  if( (pPg->flags 
1e150 26 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  & PGHDR_IN_JOURN
1e160 41 4c 29 21 3d 30 20 7c 7c 20 28 69 6e 74 29 70  AL)!=0 || (int)p
1e170 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1e180 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1e190 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
1e1a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53  endif..  /* If S
1e1b0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20  ECURE_DELETE is 
1e1c0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
1e1d0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
1e1e0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f  hat this.  ** ro
1e1f0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1e200 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f  led on a page fo
1e210 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50  r which sqlite3P
1e220 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a  agerDontWrite().
1e230 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1e240 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
1e250 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73  led during the s
1e260 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ame transaction.
1e270 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e  .  ** And if Don
1e280 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65  tWrite() has pre
1e290 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c  viously been cal
1e2a0 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  led, the followi
1e2b0 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  ng.  ** conditio
1e2c0 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a  ns must be met..
1e2d0 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72    **.  ** (Later
1e2e0 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49  :)  Not true.  I
1e2f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e300 73 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 68  s corrupted by h
1e310 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a  aving duplicate.
1e320 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68    ** pages on th
1e330 65 20 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20  e freelist (ex: 
1e340 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29 20 74  corrupt9.test) t
1e350 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1e360 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  g is not.  ** ne
1e370 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a  cessarily true:.
1e380 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74    */.  /* assert
1e390 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1e3a0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1e3b0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1e3c0 72 69 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a  rigDbSize ); */.
1e3d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e3e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1e3f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74   );.  sqlite3Bit
1e400 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1e410 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
1e420 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66 6c  pgno);.  pPg->fl
1e430 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f  ags |= PGHDR_IN_
1e440 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50 67 2d 3e  JOURNAL;.  pPg->
1e450 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
1e460 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 69 66 28  NEED_READ;.  if(
1e470 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1e480 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
1e490 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
1e4a0 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze >= pPager->or
1e4b0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1e4c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1e4d0 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
1e4e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1e4f0 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
1e500 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
1e510 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1e520 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1e530 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e540 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
1e550 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
1e560 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1e570 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1e580 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e590 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
1e5a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e5b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
1e5c0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
1e5d0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
1e5e0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
1e5f0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
1e600 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1e610 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1e620 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50  t isDirect){.  P
1e630 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1e640 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1e650 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e660 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64  QLITE_OK;..#ifnd
1e670 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e680 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1e690 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
1e6a0 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72  ==0 );  /* isDir
1e6b0 65 63 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65  ect is only true
1e6c0 20 66 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74   for atomic writ
1e6d0 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  es */.#endif.  i
1e6e0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1e6f0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1e700 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e710 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1e720 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1e730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e740 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1e750 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1e760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e770 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1e780 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
1e790 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1e7a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e7b0 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
1e7c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e7d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1e7e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e7f0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20  pPgHdr);.       
1e800 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e810 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e820 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1e830 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1e840 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1e850 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1e860 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1e870 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e880 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
1e890 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
1e8a0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e8b0 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1e8c0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
1e8d0 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
1e8e0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1e8f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1e900 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1e910 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69 72  TE.    if( isDir
1e920 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66  ect && pPager->f
1e930 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1e940 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
1e950 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
1e960 70 44 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20  pData;.      rc 
1e970 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1e980 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
1e990 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
1e9a0 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  ize, 0);.    }.#
1e9b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
1e9c0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1e9d0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
1e9e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e9f0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
1ea00 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ea10 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
1ea20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea30 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1ea40 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
1ea50 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
1ea60 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
1ea70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ea80 74 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44  t rc;.  if( MEMD
1ea90 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  B ){.    rc = SQ
1eaa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1eab0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1eac0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1ead0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1eae0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1eaf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1eb00 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1eb10 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1eb20 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1eb30 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1eb40 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1eb50 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1eb60 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1eb70 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1eb80 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1eb90 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1eba0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1ebb0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1ebc0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1ebd0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1ebe0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1ebf0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1ec00 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1ec10 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1ec20 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1ec30 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1ec40 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1ec50 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1ec60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1ec70 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1ec80 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1ec90 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1eca0 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1ecb0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1ecc0 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1ecd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1ece0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1ecf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1ed00 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1ed10 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1ed20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1ed30 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1ed40 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1ed50 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1ed60 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1ed70 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1ed80 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1ed90 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1eda0 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1edb0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1edc0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1edd0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1ede0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1edf0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1ee00 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1ee10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
1ee20 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
1ee30 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
1ee40 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1ee50 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
1ee60 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
1ee70 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ee80 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1ee90 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
1eea0 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
1eeb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
1eec0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
1eed0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
1eee0 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
1eef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
1ef00 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
1ef10 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ef20 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
1ef30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
1ef40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1ef50 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54  ster, .  Pgno nT
1ef60 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79  runc,.  int noSy
1ef70 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
1ef80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1ef90 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1efa0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1efb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1efc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
1efd0 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
1efe0 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
1eff0 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
1f000 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
1f010 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1f020 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
1f030 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
1f040 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1f050 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f060 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
1f070 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
1f080 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
1f090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f0a0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1f0b0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
1f0c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1f0d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f0e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
1f0f0 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1f100 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1f110 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1f120 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1f130 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1f140 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1f150 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1f160 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1f170 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1f180 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1f190 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1f1a0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1f1b0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1f1c0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1f1d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1f1e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1f1f0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1f200 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1f210 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1f220 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f230 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
1f240 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f250 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
1f260 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1f270 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
1f280 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
1f290 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
1f2a0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1f2b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f2c0 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
1f2d0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
1f2e0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
1f2f0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
1f300 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
1f310 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
1f320 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
1f330 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
1f340 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
1f350 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
1f360 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
1f370 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
1f380 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1f390 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
1f3a0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1f3b0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
1f3c0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
1f3d0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1f3e0 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
1f3f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
1f400 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
1f410 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
1f420 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
1f430 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d      */.    pPg =
1f440 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1f450 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1f460 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 69 6e  pPCache);.    in
1f470 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  t useAtomicWrite
1f480 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d   = (.        !zM
1f490 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20  aster && .      
1f4a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f4b0 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20  lOpen &&.       
1f4c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f4d0 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
1f4e0 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
1f4f0 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d          nTrunc==
1f500 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70  0 && .        (p
1f510 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44  Pg==0 || pPg->pD
1f520 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a  irty==0).    );.
1f530 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1f540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1f550 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1f560 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1f570 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
1f580 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d  .    if( useAtom
1f590 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  icWrite ){.     
1f5a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e   /* Update the n
1f5b0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
1f5c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1f5d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73  /.      int offs
1f5e0 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
1f5f0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
1f600 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
1f610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1f620 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a  ager->nRec==1);.
1f630 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1f640 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1f650 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67  fd, offset, pPag
1f660 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
1f670 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1f680 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
1f690 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c  ounter. The foll
1f6a0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
1f6b0 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20  modify.      ** 
1f6c0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
1f6d0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1f6e0 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64  page 1 to includ
1f6f0 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20  e the updated.  
1f700 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f      ** change co
1f710 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
1f720 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65  rite page 1 dire
1f730 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
1f740 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
1f750 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
1f760 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
1f770 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
1f780 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
1f790 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  , .      ** this
1f7a0 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
1f7b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
1f7c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f7d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f7e0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1f7f0 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
1f800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1f810 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1f820 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
1f830 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
1f840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f850 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20  !useAtomicWrite 
1f860 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f870 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   ).#endif..    /
1f880 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1f890 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1f8a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f8b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1f8c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1f8d0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1f8e0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1f8f0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1f900 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1f910 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1f920 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1f930 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1f940 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1f950 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1f960 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1f970 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1f980 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1f990 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1f9a0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1f9b0 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1f9c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f9d0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1f9e0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1f9f0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1fa00 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1fa10 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1fa20 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
1fa30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa40 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fa50 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  t;.      if( pPa
1fa60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1fa70 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1fa80 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64  ODE_OFF ){.#ifnd
1fa90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1faa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1fab0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1fac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1fad0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1fae0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1faf0 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1fb00 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1fb10 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  s.          ** b
1fb20 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1fb30 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1fb40 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1fb50 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1fb60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c            ** fil
1fb70 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1fb80 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1fb90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1fba0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
1fbb0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
1fbc0 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d           for( i=
1fbd0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1fbe0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1fbf0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1fc00 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1fc10 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1fc20 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
1fc30 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1fc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1fc50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fc60 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
1fc70 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1fc80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fc90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1fca0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1fcb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fcc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1fcd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1fce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fcf0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1fd00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fd10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1fd20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1fd30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fd40 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 7d 0a     } .        }.
1fd50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
1fd60 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1fd70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1fd80 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
1fd90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fda0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1fdb0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  xit;.        rc 
1fdc0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1fdd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
1fde0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1fdf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fe00 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69  o sync_exit;..#i
1fe10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fe20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1fe30 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1fe40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fe50 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1fe60 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1fe70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fe80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fe90 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fea0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1feb0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1fec0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1fed0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1fee0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1fef0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1ff00 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1ff10 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1ff20 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1ff30 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1ff40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ff50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1ff60 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
1ff70 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
1ff80 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
1ff90 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
1ffa0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
1ffb0 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
1ffc0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
1ffd0 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
1ffe0 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
1fff0 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
20000 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
20010 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
20020 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
20030 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
20040 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
20050 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
20060 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
20070 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
20080 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
20090 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
200a0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
200b0 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
200c0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
200d0 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
200e0 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
200f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20100 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20110 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20120 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
20130 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20140 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
20150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20160 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
20170 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
20180 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
20190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
201a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
201b0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
201c0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
201d0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
201e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
201f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20200 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
20210 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
20220 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
20230 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
20240 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
20250 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
20260 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
20270 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
20280 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
20290 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
202a0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
202b0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
202c0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
202d0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
202e0 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
202f0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
20300 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
20310 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
20320 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
20330 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
20340 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
20350 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
20360 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
20370 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
20380 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
20390 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
203a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
203b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
203c0 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
203d0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
203e0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
203f0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
20400 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
20410 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
20420 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
20430 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
20440 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
20450 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
20460 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
20470 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
20480 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
20490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
204a0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
204b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
204c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
204d0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
204e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
204f0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
20500 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20510 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20520 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
20530 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
20540 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
20550 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
20560 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
20570 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
20580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
20590 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
205a0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
205b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
205c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
205d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
205e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
205f0 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
20600 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
20610 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
20620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50  LITE_OK;.  }.  P
20630 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
20640 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
20650 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
20660 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73  ( MEMDB ){.    s
20670 71 6c 69 74 65 33 50 63 61 63 68 65 43 6f 6d 6d  qlite3PcacheComm
20680 69 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  it(pPager->pPCac
20690 68 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  he, 0);.    sqli
206a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
206b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
206c0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  e);.    sqlite3P
206d0 63 61 63 68 65 53 65 74 46 6c 61 67 73 28 70 50  cacheSetFlags(pP
206e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 0a  ager->pPCache, .
206f0 20 20 20 20 20 20 20 7e 28 50 47 48 44 52 5f 49         ~(PGHDR_I
20700 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47 48 44  N_JOURNAL | PGHD
20710 52 5f 4e 45 45 44 5f 53 59 4e 43 29 2c 20 30 0a  R_NEED_SYNC), 0.
20720 20 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65      );.    pPage
20730 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20740 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
20750 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
20760 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20770 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
20780 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20790 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
207a0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
207b0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
207c0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
207d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
207e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
207f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
20810 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
20820 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
20830 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
20840 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
20850 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
20860 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
20870 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
20880 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
20890 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
208a0 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
208b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
208c0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
208d0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
208e0 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
208f0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
20900 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
20910 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c   protocol or unl
20920 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
20930 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
20940 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
20950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20960 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
20970 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
20980 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
20990 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
209a0 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
209b0 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
209c0 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
209d0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
209e0 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
209f0 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
20a00 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
20a10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20a20 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
20a30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a50 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
20a60 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
20a70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
20a80 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
20a90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
20aa0 68 65 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  heRollback(pPage
20ab0 72 2d 3e 70 50 43 61 63 68 65 2c 20 31 29 3b 0a  r->pPCache, 1);.
20ac0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
20ad0 65 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  eRollback(pPager
20ae0 2d 3e 70 50 43 61 63 68 65 2c 20 30 29 3b 0a 20  ->pPCache, 0);. 
20af0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
20b00 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
20b10 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 73  >pPCache);.    s
20b20 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 46  qlite3PcacheSetF
20b30 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
20b40 61 63 68 65 2c 20 0a 20 20 20 20 20 20 20 7e 28  ache, .       ~(
20b50 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
20b60 20 7c 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   | PGHDR_NEED_SY
20b70 4e 43 29 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  NC), 0.    );.  
20b80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20b90 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
20ba0 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72  bSize;.    pager
20bb0 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
20bc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
20bd0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
20be0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
20bf0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
20c00 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
20c10 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
20c20 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
20c30 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
20c40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20c50 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20c60 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
20c70 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
20c80 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20c90 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
20ca0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
20cb0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
20cc0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
20cd0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
20ce0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
20cf0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
20d00 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
20d10 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
20d20 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
20d30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
20d40 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
20d50 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
20d60 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
20d70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
20d80 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
20d90 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
20da0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
20db0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
20dc0 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
20dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
20df0 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
20e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e10 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20e20 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
20e40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
20e50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65  ..    /* If an e
20e60 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
20e70 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
20e80 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
20e90 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
20ea0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f      ** cache. So
20eb0 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
20ec0 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
20ed0 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
20ee0 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72  rror .    ** per
20ef0 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  sistent..    */.
20f00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
20f10 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
20f20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20f30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
20f40 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
20f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
20f60 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
20f70 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
20f80 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
20f90 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
20fa0 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
20fb0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
20fc0 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
20fd0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
20fe0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
20ff0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
21000 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
21010 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
21020 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
21030 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
21040 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
21050 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21060 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
21070 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
21080 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 23 69 66 64  PCache);.}..#ifd
21090 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
210a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
210b0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
210c0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
210d0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
210e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
210f0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
21100 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
21110 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
21120 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
21130 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
21140 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
21150 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
21160 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
21170 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
21180 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
21190 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
211a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
211b0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
211c0 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
211d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
211e0 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
211f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
21200 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
21210 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
21220 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
21230 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
21240 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
21250 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
21260 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
21270 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
21280 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
21290 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  a;.}.int sqlite3
212a0 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
212b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
212c0 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23  eturn MEMDB;.}.#
212d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
212e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
212f0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
21300 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21310 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
21320 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
21330 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21340 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
21350 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
21360 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
21370 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
21380 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
21390 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
213a0 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
213b0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
213c0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
213d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
213e0 70 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 61 73 73 65 72   int rc;.  asser
21410 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
21420 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
21430 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21440 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
21450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21460 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
21470 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
21480 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
21490 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
214a0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
214b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
214c0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
214d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
214e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
214f0 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
21500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21510 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
21520 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
21530 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21540 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
21550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21560 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21580 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  en );.  assert( 
21590 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
215a0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
215b0 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  pInStmt = sqlite
215c0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
215d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
215e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
215f0 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
21600 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
21610 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
21620 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
21630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21640 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
21650 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
21660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21670 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
21680 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
21690 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
216a0 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
216b0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
216c0 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
216d0 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
216e0 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
216f0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
21700 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
21710 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
21720 67 65 72 2d 3e 73 74 66 64 2c 20 53 51 4c 49 54  ger->stfd, SQLIT
21730 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
21740 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  L);.    if( rc )
21750 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d  {.      goto stm
21760 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
21770 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21780 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
21790 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
217a0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
217b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
217c0 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
217d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
217e0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
217f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
21800 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
21810 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
21820 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
21830 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
21840 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  pInStmt = 0;.  }
21850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21860 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21870 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
21880 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21890 72 63 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  rc;.  rc = pager
218a0 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
218b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
218c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
218d0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
218e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
218f0 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72  StmtCommit(Pager
21900 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
21910 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
21920 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
21930 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
21940 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
21950 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
21960 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
21970 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
21980 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
21990 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
219a0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
219b0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
219c0 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
219d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
219e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
219f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
21a00 61 63 68 65 43 6f 6d 6d 69 74 28 70 50 61 67 65  acheCommit(pPage
21a10 72 2d 3e 70 50 43 61 63 68 65 2c 20 31 29 3b 0a  r->pPCache, 1);.
21a20 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21a30 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21a40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21a50 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  InUse = 0;.  }. 
21a60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21a70 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
21a80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21a90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
21aa0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
21ab0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21ac0 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61  rStmtRollback(Pa
21ad0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21ae0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
21af0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21b00 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
21b10 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
21b20 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
21b30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
21b40 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
21b50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
21b60 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 2d 3e  ollback(pPager->
21b70 70 50 43 61 63 68 65 2c 20 31 29 3b 0a 20 20 20  pPCache, 1);.   
21b80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
21b90 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
21ba0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
21bb0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
21bc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
21bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21bf0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
21c00 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
21c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21c20 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
21c30 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
21c40 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
21c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21c60 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
21c70 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
21c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21c90 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
21ca0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
21cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21cc0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
21cd0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
21ce0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21cf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21d00 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
21d10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21d20 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
21d30 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
21d40 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
21d50 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
21d60 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
21d70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21d80 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
21d90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21da0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
21db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21dc0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
21dd0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
21de0 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
21df0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
21e00 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
21e10 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
21e20 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
21e30 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
21e40 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
21e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21e60 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
21e70 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
21e80 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
21e90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
21ea0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21eb0 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
21ec0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21ed0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21ee0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
21ef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21f00 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21f10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21f20 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21f30 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
21f40 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
21f50 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21f60 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
21f70 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
21f80 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
21f90 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
21fa0 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
21fb0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
21fc0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
21fd0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
21fe0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
21ff0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
22000 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
22010 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22020 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
22030 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22040 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
22050 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
22060 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
22070 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22080 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
22090 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
220a0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
220b0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
220c0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
220d0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
220e0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
220f0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
22100 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
22110 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
22120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22130 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
22140 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
22150 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
22160 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
22170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
22180 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
22190 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
221a0 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
221b0 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
221c0 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
221d0 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
221e0 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
221f0 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
22200 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
22210 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63  age previous loc
22220 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
22230 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
22240 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
22250 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
22260 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
22270 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
22280 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
22290 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
222a0 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
222b0 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
222c0 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
222d0 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
222e0 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
222f0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
22300 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
22310 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
22320 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
22330 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
22340 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
22350 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
22360 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
22370 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
22380 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
22390 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
223a0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
223b0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
223c0 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
223d0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
223e0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
223f0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
22400 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
22410 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
22420 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
22430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22440 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
22450 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
22460 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
22470 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
22480 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
22490 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
224a0 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
224b0 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
224c0 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
224d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
224e0 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
224f0 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
22500 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
22510 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
22520 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
22530 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
22540 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
22550 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
22560 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
22570 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
22580 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
22590 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
225a0 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
225b0 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
225c0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
225d0 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65  *pPgOld;  /* The
225e0 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72   page being over
225f0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67  written. */.  Pg
22600 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
22610 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
22620 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
22630 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
22640 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
22650 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
22660 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
22670 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
22680 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
22690 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
226a0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
226b0 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
226c0 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
226d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
226e0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
226f0 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
22700 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f  ntent(pPg);..  /
22710 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
22720 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
22730 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
22740 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
22750 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
22760 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
22770 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
22780 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
22790 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
227a0 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
227b0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
227c0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
227d0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
227e0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
227f0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
22800 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
22810 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
22820 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
22830 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
22840 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
22850 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
22860 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
22870 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
22880 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
22890 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
228a0 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
228b0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
228c0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
228d0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
228e0 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 7c  DR_IN_JOURNAL) |
228f0 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
22900 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
22910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22920 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
22930 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65  IRTY );.    asse
22940 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
22950 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
22960 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
22970 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
22980 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
22990 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
229a0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61    ** from its ha
229b0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
229c0 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
229d0 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
229e0 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
229f0 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
22a00 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
22a10 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
22a20 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
22a30 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
22a40 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
22a50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 50 47  g->flags &= ~(PG
22a60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 7c 50 47  HDR_NEED_SYNC|PG
22a70 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  HDR_IN_JOURNAL);
22a80 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
22a90 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
22aa0 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
22ab0 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67  ( !pPgOld || pPg
22ac0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  Old->nRef==1 );.
22ad0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
22ae0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
22af0 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73  = (pPgOld->flags
22b00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
22b10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
22b20 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
22b30 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
22b40 6c 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  l, pgno) ){.    
22b50 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
22b60 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  HDR_IN_JOURNAL;.
22b70 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63    }..  sqlite3Pc
22b80 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67  acheMove(pPg, pg
22b90 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
22ba0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
22bb0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c  PcacheMove(pPgOl
22bc0 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  d, 0);.    sqlit
22bd0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
22be0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
22bf0 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
22c00 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
22c10 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67  ache = 1;.  pPag
22c20 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
22c30 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
22c40 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
22c50 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
22c60 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
22c70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
22c80 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
22c90 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
22ca0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
22cb0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
22cc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
22cd0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
22ce0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
22cf0 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
22d00 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
22d10 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
22d20 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
22d30 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
22d40 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
22d50 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
22d60 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
22d70 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
22d80 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
22d90 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22da0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
22db0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
22dc0 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
22dd0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
22de0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
22df0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
22e00 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
22e10 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
22e20 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
22e30 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
22e40 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
22e50 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
22e60 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
22e70 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
22e80 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
22e90 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
22ea0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
22eb0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
22ec0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
22ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22ee0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
22ef0 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
22f00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
22f10 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
22f20 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
22f30 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
22f40 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
22f50 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
22f60 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
22f70 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
22f80 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
22f90 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
22fa0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
22fb0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
22fc0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
22fd0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
22fe0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
22ff0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
23000 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
23010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23020 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
23030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23040 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
23050 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
23060 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
23070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23080 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23090 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
230a0 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50 67   (int)needSyncPg
230b0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
230c0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
230d0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
230e0 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
230f0 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
23100 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  cPgno);.      }.
23110 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23120 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
23130 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
23140 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
23150 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
23160 5f 53 59 4e 43 3b 0a 20 20 20 20 70 50 67 48 64  _SYNC;.    pPgHd
23170 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
23180 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  R_IN_JOURNAL;.  
23190 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
231a0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
231b0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
231c0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
231d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
231e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
231f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23200 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
23210 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
23220 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
23230 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
23240 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
23250 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
23260 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  >0 );.  return p
23270 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
23280 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23290 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
232a0 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
232b0 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
232c0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
232d0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
232e0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
232f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
23300 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
23310 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
23320 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
23330 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
23340 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45   (pPager?pPg->pE
23350 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  xtra:0);.}../*.*
23360 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
23370 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
23380 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
23390 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
233a0 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
233b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
233c0 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
233d0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
233e0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
233f0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
23400 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
23410 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
23420 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
23430 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
23440 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
23450 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
23460 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
23470 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
23480 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23490 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
234a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
234b0 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
234c0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
234d0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
234e0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
234f0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
23500 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
23510 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
23520 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
23530 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
23540 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
23550 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
23560 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
23570 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23580 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
23590 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
235a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
235b0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
235c0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
235d0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
235e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
235f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
23600 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
23610 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
23620 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
23630 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
23640 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
23650 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
23660 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
23670 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65   eMode;.  }.  re
23680 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
23690 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
236a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
236b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
236c0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
236d0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
236e0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
236f0 2a 20 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e  * of PAGER_JOURN
23700 41 4c 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  ALMODE_QUERY, PA
23710 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23720 44 45 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41  DELETE or .** PA
23730 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23740 50 45 52 53 49 53 54 2e 20 49 66 20 74 68 65 20  PERSIST. If the 
23750 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
23760 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
23770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
23780 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
23790 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
237a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
237b0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
237c0 68 65 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  her PAGER_JOURNA
237d0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a  LMODE_DELETE or.
237e0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
237f0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e  MODE_PERSIST, in
23800 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
23810 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
23820 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e  pdated).** journ
23830 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
23840 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
23850 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
23860 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
23870 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
23880 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
23890 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
238a0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
238b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
238c0 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
238d0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
238e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
238f0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
23900 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
23910 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
23920 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
23930 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
23940 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
23950 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
23960 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
23970 45 54 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  ETE>=0 && PAGER_
23980 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
23990 49 53 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IST>=0 );.  if( 
239a0 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20  eMode>=0 ){.    
239b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
239c0 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
239d0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
239e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
239f0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
23a00 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
23a10 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
23a20 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
23a30 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71  files..*/.i64 sq
23a40 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
23a50 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72  lSizeLimit(Pager
23a60 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c   *pPager, i64 iL
23a70 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69  imit){.  if( iLi
23a80 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70  mit>=-1 ){.    p
23a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
23aa0 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  zeLimit = iLimit
23ab0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
23ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
23ad0 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64  zeLimit;.}..#end
23ae0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23af0 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.