/ Hex Artifact Content
Login

Artifact 6b6f8eb4938d184d6612ea89631185dbace246b3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 30  : pager.c,v 1.50
0350: 32 20 32 30 30 38 2f 31 31 2f 30 37 20 30 30 3a  2 2008/11/07 00:
0360: 32 34 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a  24:54 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 75 33 32 20 73 65 63  n() */.  u32 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 52 65  dif.  void (*xRe
28c0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
28d0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
28e0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
28f0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
2900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2910: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
2920: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2930: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
2940: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
2950: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
2960: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
2970: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
2980: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
2990: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
29a0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
29b0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
29c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
29d0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
29e0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
29f0: 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  use */.  char db
2a00: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
2a10: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
2a20: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
2a30: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
2a40: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
2a50: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
2a60: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
2a70: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
2a80: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
2a90: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ab0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
2ac0: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 7d  ache object */.}
2ad0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
2ae0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
2af0: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
2b00: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
2b10: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
2b20: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
2b30: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
2b40: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
2b50: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
2b60: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
2b70: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
2b80: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
2b90: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ba0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
2bb0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
2bc0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
2bd0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
2be0: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
2bf0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2c00: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
2c10: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
2c20: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
2c30: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
2c40: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2c50: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
2c60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c70: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2c80: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
2c90: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
2ca0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
2cb0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2cc0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
2cd0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
2ce0: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
2cf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
2d00: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
2d10: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
2d20: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
2d30: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
2d40: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
2d50: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
2d60: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
2d70: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
2d80: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
2d90: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
2da0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
2db0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
2dc0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
2dd0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
2de0: 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77  al is begin.** w
2df0: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
2e00: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
2e10: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
2e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
2e30: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
2e40: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
2e50: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
2e60: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
2e70: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
2e80: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
2e90: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
2ea0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
2eb0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
2ec0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
2ed0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
2ee0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
2ef0: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
2f00: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
2f10: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
2f20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
2f30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2f40: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
2f50: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
2f60: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
2f70: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
2f80: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
2f90: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
2fa0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
2fb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2fc0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
2fd0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
2fe0: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
2ff0: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
3000: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
3010: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
3020: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
3030: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
3040: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
3050: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
3060: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
3070: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
3080: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
3090: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
30a0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
30b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
30c0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
30d0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
30e0: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
30f0: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
3100: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
3110: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
3120: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
3130: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
3140: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
3150: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
3160: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
3170: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
3180: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
3190: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
31a0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
31b0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
31c0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
31d0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
31e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
31f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3200: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
3210: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
3220: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
3230: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
3240: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
3250: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
3260: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
3270: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
3280: 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d  ournal is determ
3290: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  ined.** by the f
32a0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e  ollowing macros.
32b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
32c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
32d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
32e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
32f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
3300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
3310: 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68  his pager. In th
3320: 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63  e future, this c
3330: 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74  ould be.** set t
3340: 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61  o some value rea
3350: 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  d from the disk 
3360: 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20  controller. The 
3370: 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61  important.** cha
3380: 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74  racteristic is t
3390: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61  hat it is the sa
33a0: 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73  me size as a dis
33b0: 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65  k sector..*/.#de
33c0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
33d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
33e0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
33f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
3400: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
3410: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
3420: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
3430: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
3440: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
3450: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
3460: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
3470: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
3480: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
3490: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
34a0: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
34b0: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
34c0: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
34d0: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
34e0: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
34f0: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
3500: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3510: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
3520: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
3530: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
3540: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
3550: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
3560: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
3570: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
3580: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
3590: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
35a0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
35b0: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
35c0: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
35d0: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
35e0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
35f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3600: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3610: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3620: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3630: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3640: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
3650: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
3660: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
3670: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
3680: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
3690: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
36a0: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
36b0: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
36c0: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
36d0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
36e0: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
36f0: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3700: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
3710: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
3720: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
3730: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
3750: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
3760: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
3770: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
3780: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
3790: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
37a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
37b0: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
37c0: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
37d0: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
37e0: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
37f0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
3800: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
3810: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
3820: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
3830: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3840: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
3850: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
3860: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
3870: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
3880: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
3890: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
38a0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
38b0: 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
38c0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
38d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
38e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
38f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
3900: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
3910: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
3920: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
3930: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
3940: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
3950: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
3960: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
3970: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
3980: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
3990: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
39a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
39b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
39c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
39d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
39e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
39f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
3a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
3a10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
3a20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
3a30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
3a40: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
3a50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3a60: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
3a70: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
3a80: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
3a90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
3aa0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
3ab0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
3ac0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
3ad0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
3ae0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
3af0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
3b00: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
3b10: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
3b20: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3b30: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
3b40: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
3b50: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
3b60: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
3b70: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
3b80: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
3b90: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
3ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3bb0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
3bc0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
3bd0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
3be0: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
3bf0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
3c00: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
3c10: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
3c20: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
3c30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
3c40: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
3c50: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
3c60: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
3c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
3c80: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
3c90: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
3ca0: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
3cb0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
3cc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3cd0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
3ce0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
3cf0: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
3d00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3d10: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
3d20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
3d30: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
3d40: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
3d50: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
3d60: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
3d70: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
3d80: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
3d90: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
3da0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
3db0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
3dc0: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
3dd0: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
3de0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
3df0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
3e00: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
3e10: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
3e20: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
3e30: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
3e40: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
3e50: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
3e60: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
3e70: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
3e80: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
3e90: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
3ea0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
3eb0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
3ec0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
3ed0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
3ee0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3ef0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
3f00: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
3f10: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
3f20: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
3f30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3f40: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
3f50: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
3f60: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
3f70: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
3f80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
3f90: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
3fa0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
3fb0: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
3fc0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
3fd0: 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20    int szPage;   
3fe0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
3ff0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
4000: 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
4010: 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d  ->fd;..  if( fd-
4020: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
4030: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
4040: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
4050: 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53  tics(fd);.    nS
4060: 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f  ector = sqlite3O
4070: 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b  sSectorSize(fd);
4080: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
4090: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
40a0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51    }..  assert(SQ
40b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
40c0: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
40d0: 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45  .  assert(SQLITE
40e0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
40f0: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a  ==(65536>>8));..
4100: 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68    if( !fd->pMeth
4110: 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20 28  ods || .       (
4120: 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f 43  dc & (SQLITE_IOC
4130: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
4140: 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74 6f  e>>8)) && nSecto
4150: 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  r<=szPage) ){.  
4160: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
4170: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
4180: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
4190: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
41a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
41b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
41c0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
41d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
41e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
41f0: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
4200: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
4210: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
4220: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
4230: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
4240: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
4250: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
4260: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
4270: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
4280: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
4290: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
42a0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
42b0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
42c0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
42d0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
42e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
42f0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
4300: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
4310: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
4320: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
4330: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
4340: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
4350: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
4360: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
4370: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4380: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
4390: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
43a0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
43b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
43c0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
43d0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
43e0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
43f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
4400: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
4410: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
4420: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
4430: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
4440: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
4450: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
4460: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
4470: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
4480: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
4490: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
44a0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
44b0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
44c0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
44d0: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
44e0: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
44f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
4500: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
4510: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
4520: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
4530: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
4540: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
4550: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
4560: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
4570: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
4580: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
4590: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
45a0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
45b0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
45c0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
45d0: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
45e0: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
45f0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4600: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
4610: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
4620: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4630: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
4640: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
4650: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
4660: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
4670: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20  AGER_UNLOCK .   
4680: 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
4690: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
46a0: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
46b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
46c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
46d0: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
46e0: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
46f0: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
4700: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
4710: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
4720: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
4730: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
4740: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
4750: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
4760: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
4770: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
4780: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
47a0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
47b0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
47c0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
47d0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
47e0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
47f0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
4800: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
4810: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
4820: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
4830: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
4840: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
4850: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
4860: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
4870: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
4880: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
4890: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
48a0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
48b0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
48c0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
48d0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
48e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
48f0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
4900: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
4910: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
4920: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
4930: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
4940: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
4950: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
4960: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
4970: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
4980: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
4990: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
49a0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
49b0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
49c0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
49d0: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
49e0: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
49f0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
4a00: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
4a10: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
4a20: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
4a30: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
4a40: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
4a50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
4a60: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
4a70: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
4a80: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
4a90: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
4aa0: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
4ab0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
4ac0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
4ad0: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
4ae0: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
4af0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
4b00: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
4b10: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
4b20: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
4b30: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
4b40: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4b50: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
4b60: 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73  t( !pPg->pageHas
4b70: 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  h || pPager->err
4b80: 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70  Code.      || (p
4b90: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
4ba0: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
4bb0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
4bc0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
4bd0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
4be0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
4bf0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
4c00: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
4c10: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45  )  0.#define CHE
4c20: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
4c30: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
4c40: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
4c50: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
4c60: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
4c70: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
4c80: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
4c90: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
4ca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4cb0: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
4cc0: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
4cd0: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
4ce0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
4cf0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20  ory supplied by 
4d00: 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a  the caller. .**.
4d10: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
4d20: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
4d30: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
4d40: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
4d50: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
4d60: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
4d70: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
4d80: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
4d90: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
4da0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
4db0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
4dc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4dd0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
4de0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
4df0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
4e00: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
4e10: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
4e20: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
4e30: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
4e40: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
4e50: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
4e60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
4e70: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
4e80: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
4e90: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  al..**.** If no 
4ea0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4eb0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
4ec0: 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  ent zMaster[0] i
4ed0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
4ee0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
4ef0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
4f00: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
4f10: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
4f20: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
4f30: 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d  *zMaster, int nM
4f40: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
4f50: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
4f60: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
4f70: 73 75 6d 3b 0a 20 20 75 33 32 20 75 3b 20 20 20  sum;.  u32 u;   
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
4fa0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
4fb0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
4fc0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
4fd0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
4fe0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
4ff0: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
5000: 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  \0';..  rc = sql
5010: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
5020: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
5030: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5040: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
5050: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5060: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5070: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b  , szJ-16, &len);
5080: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5090: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
50a0: 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d  ;..  if( len>=nM
50b0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
50c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
50d0: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
50e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
50f0: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  -12, &cksum);.  
5100: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5110: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5120: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5130: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5140: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20  ic, 8, szJ-8);. 
5150: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5160: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
5170: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
5180: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
5190: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
51a0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
51b0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
51c0: 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66  zJ-16-len);.  if
51d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
51e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
51f0: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
5200: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  len] = '\0';..  
5210: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
5220: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
5230: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5240: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
5250: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
5260: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
5270: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a  Master[u];.   }.
5280: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5290: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
52a0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
52b0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
52c0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
52d0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
52e0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
52f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5300: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5310: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5320: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5330: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5340: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5350: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5360: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5370: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5380: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5390: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d  /.    zMaster[0]
53a0: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
53b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
53c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
53d0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
53e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
53f0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
5400: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
5410: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
5420: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
5430: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
5440: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
5450: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
5460: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
5470: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
5480: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
5490: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
54a0: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
54b0: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
54c0: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5530: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
5580: 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75  tic void seekJou
5590: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
55a0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
55b0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
55c0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
55d0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
55e0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
55f0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
5600: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
5610: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
5620: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5630: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5640: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
5650: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
5660: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
5670: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
5680: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
5690: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
56a0: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
56b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
56c0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
56d0: 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68  te zeros over th
56e0: 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
56f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
5700: 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65  his has the.** e
5710: 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64  ffect of invalid
5720: 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ating the journa
5730: 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69  l file and commi
5740: 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61  tting the.** tra
5750: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
5760: 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72  tic int zeroJour
5770: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5780: 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e  ager, int doTrun
5790: 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  cate){.  int rc 
57a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
57b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
57c0: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
57d0: 30 7d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  0};..  if( pPage
57e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
57f0: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
5800: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5810: 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20  lSizeLimit;..   
5820: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
5830: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
5840: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
5850: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
5860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
5870: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
5880: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
5890: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
58a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
58b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
58c0: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
58d0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
58e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
58f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5900: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
5910: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
5920: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
5930: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
5940: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
5950: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
5960: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
5970: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
5980: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
5990: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
59a0: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
59b0: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
59c0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
59d0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
59e0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
59f0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
5a00: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
5a10: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
5a20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a30: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
5a40: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
5a50: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
5a60: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
5a70: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
5a80: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
5a90: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
5aa0: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
5ab0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
5ac0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
5ad0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5ae0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
5af0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
5b00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5b10: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
5b20: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
5b30: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5b40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
5b50: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
5b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
5b70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
5b80: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
5b90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5ba0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5bb0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
5bc0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
5bd0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
5be0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
5bf0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
5c00: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
5c10: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
5c20: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
5c30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
5c40: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
5c50: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
5c60: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
5c70: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5c80: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
5c90: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
5ca0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
5cb0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
5cc0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
5cd0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
5ce0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
5cf0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
5d00: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
5d10: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
5d20: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
5d30: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
5d40: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
5d50: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
5d60: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
5d70: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
5d80: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
5d90: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
5da0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
5db0: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
5dc0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
5dd0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
5de0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
5df0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
5e00: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
5e10: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
5e20: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5e30: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
5e40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
5e50: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
5e60: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
5e70: 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  e;.  int nHeader
5e80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
5e90: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ize;.  int nWrit
5ea0: 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  e;..  if( nHeade
5eb0: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
5ec0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
5ed0: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
5ee0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5ef0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
5f00: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
5f10: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
5f20: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
5f30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5f40: 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f  f;.  }..  seekJo
5f50: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
5f60: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5f70: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5f80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
5f90: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
5fa0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
5fb0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
5fc0: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
5fd0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
5fe0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
5ff0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
6000: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
6010: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
6020: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
6030: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
6040: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
6050: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
6060: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
6070: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
6080: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
6090: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
60a0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
60b0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
60c0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
60d0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
60e0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
60f0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
6100: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
6110: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
6120: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
6130: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
6140: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
6150: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
6160: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
6170: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6180: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
6190: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
61a0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
61b0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
61d0: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
61e0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
61f0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
6200: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
6210: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
6220: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
6230: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
6240: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
6250: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
6260: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
6270: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
6280: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
6290: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
62a0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
62b0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
62c0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
62d0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
62e0: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
62f0: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
6300: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
6310: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
6320: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
6330: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
6340: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
6350: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
6360: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
6370: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
6380: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
6390: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
63a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
63b0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
63c0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
63d0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
63e0: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
63f0: 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67  noSync) || (pPag
6400: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
6410: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
6420: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
6430: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
6440: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
6450: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
6460: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
6470: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
6480: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6490: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
64a0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
64b0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
64c0: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
64d0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
64e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
64f0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   0);.  }..  /* T
6500: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
6510: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
6520: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
6530: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
6540: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
6550: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
6560: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
6570: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6580: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6590: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
65a0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
65b0: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
65c0: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
65d0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
65e0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
65f0: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
6600: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
6610: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
6620: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
6630: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
6640: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6650: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6660: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
6670: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
6680: 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze);.  if( pPage
6690: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30  r->journalHdr==0
66a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
66b0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
66c0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
66d0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
66e0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
66f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
6700: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69  .  }..  for(nWri
6710: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
6720: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
6730: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6740: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
6750: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
6760: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
6770: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
6780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6790: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
67a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
67b0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
67c0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
67d0: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
67e0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50  rnalOff);.    pP
67f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6800: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
6810: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6830: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6840: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6850: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6860: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6870: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
6880: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
6890: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
68a0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
68b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
68c0: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
68d0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
68e0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
68f0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6900: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6910: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6920: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6930: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6940: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6950: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6960: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6970: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
6980: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
6990: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
69a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
69b0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
69c0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
69d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
69e0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
69f0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6a00: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6a10: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6a20: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6a30: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6a40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6a50: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6a60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6a70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
6a80: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
6a90: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
6aa0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
6ab0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
6ac0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
6ad0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6ae0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6af0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6b00: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6b10: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6b20: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6b30: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6b40: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6b50: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6b60: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6b70: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
6b80: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
6b90: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
6ba0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
6bb0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
6bc0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6bd0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6be0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
6bf0: 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67  lOff;.  int iPag
6c00: 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f  eSize;..  seekJo
6c10: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6c20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6c30: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6c40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6c50: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6c60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6c70: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
6c80: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
6c90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
6ca0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6cb0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6cc0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6cd0: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
6ce0: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
6cf0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
6d00: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
6d10: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
6d20: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
6d30: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6d40: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
6d50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6d60: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6d70: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6d80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6d90: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
6da0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6db0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6dc0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6dd0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
6de0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6df0: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
6e00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6e10: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6e20: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
6e30: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
6e40: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6e50: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6e60: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6e70: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36  >jfd, jrnlOff+16
6e80: 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53  , (u32 *)&iPageS
6e90: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
6ea0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
6eb0: 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   iPageSize>=512 
6ec0: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
6ed0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
6ee0: 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28  E_SIZE .   && ((
6ef0: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
6f00: 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b  geSize)==0 .  ){
6f10: 0a 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a  .    u16 pagesiz
6f20: 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20  e = iPageSize;. 
6f30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
6f40: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
6f50: 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a  pPager, &pagesiz
6f60: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
6f70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6f80: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
6f90: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
6fa0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
6fb0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
6fc0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
6fd0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6fe0: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6ff0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7000: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7010: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7020: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7030: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7040: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
7050: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
7060: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7070: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
7080: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
7090: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
70a0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
70b0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
70c0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
70d0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
70e0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
70f0: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 73 65 63  12, &pPager->sec
7100: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
7110: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7120: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
7130: 65 63 74 6f 72 53 69 7a 65 20 26 20 28 70 50 61  ectorSize & (pPa
7140: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2d  ger->sectorSize-
7150: 31 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  1))!=0.         
7160: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  || pPager->secto
7170: 72 53 69 7a 65 3e 30 78 31 30 30 30 30 30 30 20  rSize>0x1000000 
7180: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7190: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
71a0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
71b0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
71c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
71d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
71e0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
71f0: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
7200: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7210: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
7220: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7230: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
7240: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
7250: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
7260: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7270: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
7280: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
7290: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
72a0: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
72b0: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
72c0: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
72d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
72e0: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
72f0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
7300: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
7310: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
7320: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
7330: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
7340: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
7350: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
7360: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
7370: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
7380: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
7390: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
73a0: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
73b0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
73c0: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
73d0: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
73e0: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
73f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
7400: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
7410: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
7420: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
7430: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
7440: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
7450: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
7460: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
7470: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
7480: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
7490: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
74a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
74b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
74c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
74d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
74e0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
74f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7500: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
7510: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
7520: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
7530: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7540: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7550: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7560: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
7570: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
7580: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
7590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
75a0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
75b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
75c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
75d0: 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e 20  MEMORY ) return 
75e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
75f0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
7600: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
7610: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
7620: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
7630: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
7640: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
7650: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
7660: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
7670: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
7680: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
7690: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
76a0: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
76b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
76c0: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
76d0: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
76e0: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
76f0: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
7700: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
7710: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
7720: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
7730: 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61  {.    seekJourna
7740: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7750: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
7760: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7770: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
7780: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
7790: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
77a0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
77b0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41  jfd, jrnlOff, PA
77c0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
77d0: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
77e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
77f0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
7800: 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73   += 4;..  rc = s
7810: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7820: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
7830: 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66  er, len, jrnlOff
7840: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7850: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7860: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7870: 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69   len;..  put32bi
7880: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
7890: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
78a0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
78b0: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
78c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
78d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
78e0: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
78f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7900: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7910: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7920: 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  lMagic), jrnlOff
7930: 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  );.  jrnlOff += 
7940: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7950: 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65  lMagic);.  pPage
7960: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7970: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a  Pager->noSync;..
7980: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
7990: 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
79a0: 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
79b0: 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
79c0: 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
79d0: 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
79e0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
79f0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7a00: 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
7a10: 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
7a20: 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
7a30: 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
7a40: 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
7a50: 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
7a60: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
7a70: 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
7a80: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
7a90: 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
7aa0: 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
7ab0: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
7ac0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
7ad0: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
7af0: 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
7b00: 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
7b10: 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
7b20: 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
7b30: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
7b40: 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
7b50: 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
7b60: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63  .  */ .  if( (rc
7b70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
7b80: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
7b90: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
7ba0: 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
7bb0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))==SQLITE_OK. 
7bc0: 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72    && jrnlSize>jr
7bd0: 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  nlOff.  ){.    r
7be0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7bf0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
7c00: 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d  d, jrnlOff);.  }
7c10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7c20: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
7c30: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
7c40: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7c50: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7c60: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7c70: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
7c80: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
7c90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
7ca0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
7cb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7cc0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
7cd0: 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  Hdr *p;.  sqlite
7ce0: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
7cf0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
7d00: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
7d10: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7d20: 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65   Clear the in-me
7d30: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69  mory cache.  Thi
7d40: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74  s routine.** set
7d50: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
7d60: 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
7d70: 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65   what it was whe
7d80: 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a  n it was first.*
7d90: 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f  * opened.  Any o
7da0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
7db0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7dc0: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
7dd0: 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61  attempts.** to a
7de0: 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65  ccess those page
7df0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  s will likely re
7e00: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
7e10: 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mp..*/.static vo
7e20: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
7e30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7e40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
7e50: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7e60: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
7e70: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
7e80: 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  che);.}../*.** U
7e90: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7ea0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
7eb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
7ec0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
7ed0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
7ee0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
7ef0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
7f00: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
7f10: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
7f20: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
7f30: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
7f40: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
7f50: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
7f60: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
7f70: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
7f80: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
7f90: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
7fa0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
7fb0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
7fc0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
7fd0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
7fe0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
7ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8000: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
8010: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
8020: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8030: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
8040: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
8050: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
8060: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
8070: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
8080: 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
8090: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
80a0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
80b0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
80c0: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 41 6c  ger))..    /* Al
80d0: 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a  ways close the j
80e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
80f0: 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
8100: 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20  tabase lock..   
8110: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
8120: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
8130: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
8140: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
8150: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
8160: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
8170: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
8180: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
8190: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
81a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
81b0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
81c0: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
81d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
81e0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
81f0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8200: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
8210: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8220: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
8230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
8240: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8250: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8260: 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ack);.      pPag
8270: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8280: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ack = 0;.    }..
8290: 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e      /* If Pager.
82a0: 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
82b0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
82c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
82d0: 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  cannot be.    **
82e0: 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
82f0: 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  at the pager fil
8300: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  e is unlocked, t
8310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
8320: 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20  he.    ** cache 
8330: 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
8340: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
8350: 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72  ode safely clear
8360: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
8370: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
8380: 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  de ){.      if( 
8390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
83a0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
83b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
83c0: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
83d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
83e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
83f0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
8400: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
8410: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
8420: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
8430: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
8440: 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
8450: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
8460: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
8470: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
8480: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
8490: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
84a0: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Use = 0;.      p
84b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
84c0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
84d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
84e0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
84f0: 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
8500: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  pen = 0;.      p
8510: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8520: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
8530: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
8540: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
8550: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
8560: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
8570: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
8580: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
8590: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
85a0: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
85b0: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
85c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
85d0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
85e0: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
85f0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
8600: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  .** do not attem
8610: 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  pt the rollback.
8620: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8630: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
8640: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
8650: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
8660: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
8670: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
8680: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8690: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
86a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
86b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
86c0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
86d0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
86e0: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
86f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d  ger_unlock(p);.}
8700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8710: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
8720: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
8730: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
8740: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
8750: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
8760: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
8770: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8780: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
8790: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
87a0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
87b0: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
87c0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
87d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
87e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
87f0: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
8800: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
8810: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
8820: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
8830: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
8840: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
8850: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
8860: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
8870: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
8880: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
8890: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
88a0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
88b0: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
88c0: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
88d0: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
88e0: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
88f0: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
8900: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
8910: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
8920: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
8930: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
8940: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
8950: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
8960: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
8970: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
8980: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
8990: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
89a0: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
89b0: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
89c0: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
89d0: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
89e0: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8a00: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
8a10: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
8a20: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
8a30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8a40: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8a50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8a60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8a70: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
8a80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8aa0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8ab0: 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
8ac0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8ad0: 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65  mtOpen && !pPage
8ae0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
8af0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8b00: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
8b10: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
8b20: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8b30: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8b40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8b50: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8b60: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8b70: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8b80: 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
8b90: 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  int isMemoryJour
8ba0: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d  nal = sqlite3IsM
8bb0: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
8bc0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71  ->jfd);.      sq
8bd0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
8be0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
8bf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8c00: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
8c10: 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75  if( !isMemoryJou
8c20: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
8c30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8c40: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
8c50: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
8c60: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
8c70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8c80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8c90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8ca0: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
8cb0: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
8cc0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8cd0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8ce0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
8cf0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
8d00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8d10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8d20: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8d30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8d40: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8d50: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
8d60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8d70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8d80: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
8d90: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
8da0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
8db0: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
8dc0: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
8dd0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
8de0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8df0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8e00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8e10: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8e30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8e40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8e50: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8e60: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
8e70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8e80: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
8e90: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8ea0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8eb0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8ec0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
8ed0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
8ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8ef0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8f00: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
8f10: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
8f20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8f30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
8f40: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8f50: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
8f60: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
8f70: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8f80: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8f90: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
8fa0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
8fb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
8fc0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
8fe0: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
8ff0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 23 69 66  r->pPCache);.#if
9000: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
9010: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
9020: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 28  e3PcacheIterate(
9030: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
9040: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
9050: 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ash);.#endif.   
9060: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
9070: 65 61 72 46 6c 61 67 73 28 70 50 61 67 65 72 2d  earFlags(pPager-
9080: 3e 70 50 43 61 63 68 65 2c 0a 20 20 20 20 20 20  >pPCache,.      
9090: 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41   PGHDR_IN_JOURNA
90a0: 4c 20 7c 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  L | PGHDR_NEED_S
90b0: 59 4e 43 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  YNC.    );.    p
90c0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
90d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
90e0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
90f0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9100: 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
9110: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
9120: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
9130: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
9140: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
9150: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
9160: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
9170: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9180: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
9190: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
91a0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
91b0: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
91c0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
91d0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
91e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
91f0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
9200: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9210: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9220: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9230: 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  /* lruListSetFir
9240: 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
9250: 3b 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44  ; */.  if( !MEMD
9260: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
9270: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
9280: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  }.  pPager->dbMo
9290: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72  dified = 0;..  r
92a0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
92b0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
92c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
92d0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
92e0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
92f0: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
9300: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
9310: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
9320: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
9330: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
9340: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
9350: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
9360: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
9370: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
9380: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
9390: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
93a0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
93b0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
93c0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
93d0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
93e0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
93f0: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
9400: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
9410: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
9420: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
9430: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
9440: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
9450: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
9460: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
9470: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
9480: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
9490: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
94a0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
94b0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
94c0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
94d0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
94e0: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
94f0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9500: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
9510: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
9520: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
9530: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
9540: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
9550: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
9560: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
9570: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
9580: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
9590: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
95a0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
95b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
95c0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
95d0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
95e0: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
95f0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9600: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
9610: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
9620: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
9630: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
9640: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
9650: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
9660: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
9670: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
9680: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
9690: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
96a0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
96b0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
96c0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
96d0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
96e0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
96f0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
9700: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
9710: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
9720: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
9730: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
9740: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
9750: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
9760: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
9770: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
9780: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9790: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
97a0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
97b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
97c0: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
97d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
97e0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
97f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9800: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9810: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
9820: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
9830: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
9840: 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c  * The isMainJrnl
9850: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
9860: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   this is the mai
9870: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
9880: 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20  al and.** false 
9890: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
98a0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  t journal.  The 
98b0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
98c0: 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68  urnal uses.** ch
98d0: 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
98e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
98f0: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  does not..*/.sta
9900: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
9910: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
9920: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9930: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
9940: 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65  ager being playe
9950: 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  d back */.  sqli
9960: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 20 20  te3_file *jfd,  
9970: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74 68 61   /* The file tha
9980: 74 20 69 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t is the journal
9990: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
99a0: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73  ck */.  i64 offs
99b0: 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
99c0: 4f 66 66 73 65 74 20 6f 66 20 74 68 65 20 70 61  Offset of the pa
99d0: 67 65 20 77 69 74 68 69 6e 20 74 68 65 20 6a 6f  ge within the jo
99e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
99f0: 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20 20 20 20  sMainJrnl       
9a00: 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d 61 69 6e  /* True for main
9a10: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
9a20: 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 74 6d  l. False for Stm
9a30: 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20 20 69  t jrnl */.){.  i
9a40: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
9a50: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
9a60: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
9a70: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
9a80: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
9a90: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
9aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9ab0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
9ac0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
9ad0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
9ae0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9af0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
9b00: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
9b10: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
9b20: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
9b30: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
9b40: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
9b50: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
9b60: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d 61 69  e */..  /* isMai
9b70: 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20 62 65 20  nJrnl should be 
9b80: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
9b90: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
9ba0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
9bb0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9bc0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9bd0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9be0: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9bf0: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 69 73 4d  ert( jfd == (isM
9c00: 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
9c10: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
9c20: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
9c30: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
9c40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
9c50: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
9c60: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
9c70: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9c80: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
9c90: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
9ca0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9cb0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
9cc0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9cd0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
9ce0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
9cf0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
9d00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
9d10: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
9d20: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
9d30: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
9d40: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
9d50: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
9d60: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
9d70: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
9d80: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
9d90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
9da0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
9db0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
9dc0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
9dd0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
9de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
9df0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
9e00: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
9e10: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
9e20: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
9e30: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
9e40: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
9e50: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
9e60: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
9e70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9e80: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
9e90: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
9ea0: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
9eb0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
9ec0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9ed0: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
9ee0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
9ef0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
9f00: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
9f10: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
9f20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9f30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
9f40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9f50: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
9f60: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
9f70: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
9f80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9f90: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
9fa0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
9fb0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9fc0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
9fd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
9fe0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9ff0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
a000: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
a010: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
a020: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
a030: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
a040: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
a050: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
a060: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
a070: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
a080: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
a090: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a0a0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
a0b0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
a0c0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
a0d0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
a0e0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
a0f0: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
a100: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
a110: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
a120: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
a130: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
a140: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
a150: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
a160: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
a170: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
a180: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
a190: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
a1a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
a1b0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
a1c0: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
a1d0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
a1e0: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
a1f0: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
a200: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
a210: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
a220: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
a230: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
a240: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
a250: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
a260: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
a270: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
a280: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
a290: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
a2a0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
a2b0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
a2c0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
a2d0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
a2e0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
a2f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a300: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
a310: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
a320: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
a330: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
a340: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
a350: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
a360: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
a370: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
a380: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
a390: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
a3a0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
a3b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
a3c0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
a3d0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
a3e0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
a3f0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
a400: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
a410: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
a420: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
a430: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
a440: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
a450: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
a460: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
a470: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
a480: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
a490: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
a4a0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
a4b0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
a4c0: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
a4d0: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
a4e0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
a4f0: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
a500: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
a510: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
a520: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
a530: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
a540: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
a550: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
a560: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
a570: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
a580: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
a590: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
a5a0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
a5b0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
a5c0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
a5d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
a5e0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
a5f0: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
a600: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
a610: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
a620: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
a630: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
a640: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
a650: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
a660: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
a670: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
a680: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
a690: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
a6a0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
a6b0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
a6c0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
a6d0: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
a6e0: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
a6f0: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
a700: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
a710: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
a720: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
a730: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
a740: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
a750: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
a760: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
a770: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
a780: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
a790: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
a7a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
a7b0: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
a7c0: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
a7d0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
a7e0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
a7f0: 61 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  a));.  if( (pPag
a800: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a810: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
a820: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
a830: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
a840: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
a850: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66 64 2d   && (pPager->fd-
a860: 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a  >pMethods).  ){.
a870: 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
a880: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
a890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
a8a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a8b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
a8c0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
a8d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
a8e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
a8f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
a900: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
a910: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
a920: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
a930: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
a940: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
a950: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
a960: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
a970: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
a980: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
a990: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
a9a0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
a9b0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
a9c0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
a9d0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
a9e0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
a9f0: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
aa00: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
aa10: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
aa20: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
aa30: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
aa40: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
aa50: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
aa60: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
aa70: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
aa80: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
aa90: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
aaa0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
aab0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
aac0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
aad0: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
aae0: 29 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  ) makeClean(pPg)
aaf0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ab00: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
ab10: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
ab20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ab30: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
ab40: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
ab50: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
ab60: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
ab70: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
ab80: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
ab90: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
aba0: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
abb0: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
abc0: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
abd0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
abe0: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
abf0: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
ac00: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
ac10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
ac20: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
ac30: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
ac40: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
ac50: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
ac60: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
ac70: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
ac80: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
ac90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
aca0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
acb0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
acc0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
acd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
ace0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
acf0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
ad00: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
ad10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
ad20: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
ad30: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
ad40: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
ad50: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
ad60: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
ad70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ad80: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
ad90: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
ada0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
adb0: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
adc0: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
add0: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
ade0: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
adf0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
ae00: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
ae10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  tion..**.**.** T
ae20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ae30: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
ae40: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
ae50: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
ae60: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
ae70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ae80: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
ae90: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
aea0: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
aeb0: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
aec0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
aed0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
aee0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
aef0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
af00: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
af10: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
af20: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
af30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
af40: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
af50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
af60: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
af70: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
af80: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
af90: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
afa0: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
afb0: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
afc0: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
afd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
afe0: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
aff0: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
b000: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
b010: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
b020: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
b030: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
b040: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
b050: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b060: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
b070: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
b080: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
b090: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
b0a0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
b0b0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
b0c0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
b0d0: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
b0e0: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
b0f0: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
b100: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
b110: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b120: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
b130: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
b140: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
b150: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b160: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
b170: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
b180: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
b190: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
b1a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
b1c0: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
b1d0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
b1e0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
b1f0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
b200: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
b210: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
b220: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
b230: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
b240: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
b250: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
b260: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
b270: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
b280: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
b290: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
b2a0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
b2b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b2c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b2d0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
b2e0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
b2f0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
b300: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
b310: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
b320: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
b330: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
b340: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
b350: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
b360: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
b370: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
b380: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
b390: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
b3a0: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
b3b0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
b3c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
b3d0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
b3e0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
b3f0: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
b400: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
b410: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
b420: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
b430: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
b440: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b450: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
b460: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
b470: 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72  }.    zMasterPtr
b480: 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
b490: 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
b4a0: 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l];.    rc = sql
b4b0: 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
b4c0: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
b4d0: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
b4e0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
b4f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b500: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b510: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
b520: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
b530: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
b540: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
b550: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
b560: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
b570: 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
b580: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b590: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
b5a0: 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
b5b0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
b5c0: 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
b5d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b5e0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
b5f0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b610: 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
b620: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
b630: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
b640: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
b650: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
b660: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
b670: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
b680: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
b690: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b6a0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
b6b0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
b6c0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
b6d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b6e0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
b6f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
b710: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
b720: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
b730: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
b740: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
b750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
b760: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
b770: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
b780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b790: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b7a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
b7b0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b7c0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
b7d0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
b7e0: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
b7f0: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
b800: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
b810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
b820: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
b830: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
b840: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b850: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
b860: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
b870: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
b880: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
b890: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
b8a0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
b8b0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
b8c0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
b8d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
b8e0: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
b8f0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
b900: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
b910: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
b920: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
b930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b940: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
b950: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
b960: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
b970: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
b980: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
b990: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
b9a0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
b9b0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
b9c0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
b9d0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
b9e0: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
b9f0: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
ba00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ba10: 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
ba20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
ba30: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
ba40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
ba50: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
ba60: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
ba70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
ba80: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
ba90: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
baa0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
bab0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
bac0: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
bad0: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
bae0: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
baf0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
bb00: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
bb10: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
bb20: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
bb30: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
bb40: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
bb50: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
bb60: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
bb70: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
bb80: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
bb90: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
bba0: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
bbb0: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
bbc0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
bbd0: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
bbe0: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
bbf0: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
bc00: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
bc10: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
bc20: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
bc30: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
bc40: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
bc50: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
bc60: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
bc70: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
bc80: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
bc90: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
bca0: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
bcb0: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
bcc0: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
bcd0: 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
bce0: 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68   zero byte to th
bcf0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
bd00: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
bd30: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bd40: 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
bd50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bd60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
bd70: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
bd80: 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e  SIVE && pPager->
bd90: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
bda0: 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
bdb0: 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
bdc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bdd0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bde0: 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
bdf0: 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
be00: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
be10: 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ze*(i64)nPage;. 
be20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
be30: 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
be40: 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
be50: 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
be60: 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
be70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
be80: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
be90: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
bea0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
beb0: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
bec0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
bed0: 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31  Pager->fd, "", 1
bee0: 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20  , newSize-1);.  
bef0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bf00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
bf20: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
bf30: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
bf40: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
bf50: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
bf60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
bf70: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
bf80: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
bf90: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
bfa0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
bfb0: 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20  at least as big 
bfc0: 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  as the sector si
bfd0: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
bfe0: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
bff0: 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69  rSize().  The mi
c000: 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a  nimum sector siz
c010: 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  e is 512..*/.sta
c020: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
c030: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
c040: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
c050: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
c060: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
c070: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
c080: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c090: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
c0a0: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
c0b0: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
c0c0: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
c0d0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
c0e0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
c0f0: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
c100: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
c110: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
c120: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
c130: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
c140: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
c150: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c160: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c170: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
c180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
c190: 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
c1a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
c1b0: 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
c1c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
c1d0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
c1e0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
c1f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c200: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
c210: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
c220: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
c230: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
c240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c250: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
c260: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
c270: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
c280: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
c290: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
c2a0: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
c2b0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
c2c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c2d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c2e0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
c2f0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
c300: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
c310: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
c320: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
c330: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
c340: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
c350: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
c360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
c370: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
c380: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c390: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c3a0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c3b0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
c3c0: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
c3d0: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
c3e0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
c3f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c400: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
c410: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
c420: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
c430: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
c440: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
c450: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c460: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c470: 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
c480: 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
c490: 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
c4a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
c4b0: 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
c4c0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c4d0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
c4e0: 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
c4f0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
c500: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
c510: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
c520: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c530: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
c540: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
c550: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
c560: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
c570: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
c580: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
c590: 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
c5a0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
c5b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
c5c0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
c5d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
c5e0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
c5f0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
c600: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
c610: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
c620: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
c630: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
c640: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
c650: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
c660: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
c670: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
c680: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
c690: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
c6a0: 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
c6b0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
c6c0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
c6d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
c6e0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
c6f0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
c700: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
c710: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
c720: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
c730: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
c740: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
c750: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
c760: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
c770: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
c780: 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
c790: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
c7a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
c7b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
c7c0: 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
c7d0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
c7e0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
c7f0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
c800: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
c810: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
c820: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
c830: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
c840: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
c850: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
c860: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
c870: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
c880: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c890: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
c8a0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
c8b0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
c8c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
c8d0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
c8e0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
c8f0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
c900: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c910: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
c920: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
c930: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
c940: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
c950: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
c960: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
c970: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
c980: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
c990: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
c9a0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
c9b0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
c9c0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
c9d0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
c9e0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
c9f0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
ca00: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
ca10: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
ca20: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
ca30: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
ca40: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
ca50: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
ca60: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
ca70: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
ca80: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
ca90: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
caa0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
cab0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
cac0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
cad0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
cae0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
caf0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
cb00: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
cb10: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
cb20: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
cb30: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
cb40: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
cb50: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
cb60: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
cb70: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
cb80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
cb90: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
cba0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
cbb0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
cbc0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
cbd0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
cbe0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
cbf0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
cc00: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
cc10: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
cc20: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
cc30: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
cc40: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
cc50: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
cc60: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
cc70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
cc80: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
cc90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
cca0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
ccb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
ccc0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
ccd0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
cce0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
ccf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cd10: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
cd20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
cd30: 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
cd40: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
cd50: 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
cd60: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cd70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cd80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
cd90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
cda0: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
cdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cdc0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cdd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
cde0: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce00: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
ce10: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
ce20: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
ce30: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ce40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
ce50: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
ce60: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ce70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
ce80: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
ce90: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
cea0: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
ceb0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
cec0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
ced0: 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
cee0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
cef0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
cf00: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
cf10: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
cf20: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
cf30: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
cf40: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
cf50: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
cf60: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
cf70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
cf80: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
cf90: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cfa0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
cfb0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cfc0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
cfd0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
cfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
cff0: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
d000: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
d010: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
d020: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d030: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
d040: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
d050: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
d060: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d070: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d080: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
d090: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
d0a0: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
d0b0: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
d0c0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
d0d0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
d0e0: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
d0f0: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
d100: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
d110: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
d120: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
d130: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
d140: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
d150: 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
d160: 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
d170: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d180: 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
d190: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d1a0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
d1b0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
d1c0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
d1d0: 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
d1e0: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
d1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
d200: 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
d210: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d220: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
d230: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
d240: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
d250: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
d260: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
d270: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
d280: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
d290: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
d2a0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
d2b0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
d2c0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
d2d0: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
d2e0: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
d2f0: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
d300: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
d310: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
d320: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
d330: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
d340: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
d350: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
d360: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
d370: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
d380: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
d390: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
d3a0: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
d3b0: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
d3c0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d3d0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
d3e0: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d3f0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d400: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
d410: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d420: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
d430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d440: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
d450: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
d470: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d480: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d490: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
d4a0: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
d4b0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
d4c0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
d4d0: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
d4e0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d4f0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d500: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
d510: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
d520: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
d530: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
d540: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
d550: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
d560: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
d570: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
d580: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
d590: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
d5a0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
d5b0: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
d5c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d5d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
d5e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5f0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
d600: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
d610: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d620: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
d630: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
d640: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
d650: 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
d660: 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
d670: 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
d680: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
d690: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
d6a0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
d6b0: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
d6c0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
d6d0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
d6e0: 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
d6f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
d700: 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
d710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
d720: 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
d730: 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
d740: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d750: 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
d760: 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
d770: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
d780: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
d790: 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
d7a0: 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
d7b0: 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
d7c0: 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
d7d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
d7e0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
d7f0: 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
d800: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
d810: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d820: 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
d830: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
d840: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
d850: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d860: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
d870: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
d880: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
d890: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
d8a0: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
d8b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
d8c0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
d8d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
d8e0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
d8f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
d900: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
d910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
d920: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d930: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
d940: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
d950: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
d960: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d970: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d980: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
d990: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
d9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
d9b0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
d9c0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
d9d0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
d9e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d9f0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
da00: 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
da10: 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  u++){.      rc =
da20: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
da30: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
da40: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
da50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
da60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
da70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
da80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
da90: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
daa0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
dab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
dac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dad0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dae0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
daf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
db00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
db10: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
db20: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
db30: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70 72  e database is pr
db40: 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20  obably.         
db50: 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64   ** going to end
db60: 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70   up being corrup
db70: 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75 70  t.  It is corrup
db80: 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e  t to us, anyhow.
db90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65  .          ** Pe
dba0: 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20 70  rhaps the next p
dbb0: 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
dbc0: 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e  long can fix it.
dbd0: 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ....          */
dbe0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dbf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dc00: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
dc10: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
dc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
dc40: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
dc50: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
dc60: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
dc70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dc80: 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
dc90: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dca0: 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
dcb0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
dcc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
dcd0: 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
dce0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
dcf0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
dd00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dd10: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
dd20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
dd30: 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
dd40: 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66  ='\0');.  }.  if
dd50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd60: 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
dd70: 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
dd80: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
dd90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
dda0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ddb0: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
ddc0: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
ddd0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
dde0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
ddf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
de00: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
de10: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
de20: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
de30: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
de40: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
de50: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
de60: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
de70: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
de80: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
de90: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
dea0: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
deb0: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
dec0: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
ded0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
dee0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
def0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
df00: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
df10: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
df20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
df30: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
df40: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
df50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
df60: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
df70: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
df80: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
df90: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
dfa0: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
dfb0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
dfc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
dfd0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
dfe0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
dff0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
e000: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
e010: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
e020: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
e030: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
e040: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
e050: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
e060: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
e070: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
e080: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
e090: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
e0a0: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
e0b0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
e0c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e0d0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
e0e0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
e0f0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
e100: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
e110: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
e120: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
e130: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
e140: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
e150: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e160: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
e170: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
e180: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
e1b0: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e1e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
e1f0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
e200: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
e210: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
e220: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
e230: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
e240: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
e250: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
e260: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
e270: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e280: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
e290: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
e2a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
e2b0: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
e2c0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
e2d0: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
e2e0: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
e2f0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
e300: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
e310: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
e320: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
e330: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
e340: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
e350: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
e360: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
e370: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
e380: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
e390: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
e3a0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
e3b0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
e3c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
e3d0: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  tmtSize);.  asse
e3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e3f0: 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
e400: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
e410: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
e420: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
e430: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e440: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
e450: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
e460: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
e470: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
e480: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
e490: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
e4a0: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
e4b0: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
e4c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e4d0: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
e4e0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e4f0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
e500: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
e510: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
e520: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
e530: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
e540: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
e550: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
e560: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
e570: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
e580: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
e590: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
e5a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f   i++){.    i64 o
e5b0: 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61  ffset = i*(4+pPa
e5c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e5d0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e5e0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e5f0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e600: 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30  >stfd, offset, 0
e610: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e620: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e630: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e640: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e650: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e660: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
e670: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
e680: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
e690: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e6a0: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
e6b0: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
e6c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
e6d0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
e6e0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
e6f0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
e700: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
e710: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
e720: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
e730: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
e740: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
e750: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
e760: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
e770: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
e780: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
e790: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
e7a0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
e7b0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
e7c0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
e7d0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
e7e0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
e7f0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e800: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ion..  */.  pPag
e810: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e820: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
e830: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
e840: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
e850: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
e860: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
e870: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
e880: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
e890: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
e8a0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
e8b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
e8c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
e8d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e8e0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e8f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e900: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e910: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e920: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
e930: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e940: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
e950: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
e960: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e970: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
e980: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
e990: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
e9a0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
e9b0: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
e9c0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
e9d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e9e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
e9f0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
ea00: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
ea10: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
ea20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
ea30: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
ea40: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
ea50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ea60: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
ea70: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
ea80: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
ea90: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
eaa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
eab0: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
eac0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ead0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
eae0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
eaf0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
eb00: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
eb10: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
eb20: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
eb30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
eb40: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
eb50: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
eb60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
eb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
eb80: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
eb90: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
eba0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
ebb0: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
ebc0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ebd0: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
ebe0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
ebf0: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
ec00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ec10: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
ec20: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ec30: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
ec40: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ec50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
ec60: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
ec70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ec80: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
ec90: 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
eca0: 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
ecb0: 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
ecc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
ecd0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
ece0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
ecf0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
ed00: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
ed10: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
ed20: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
ed30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
ed40: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
ed50: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
ed60: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
ed70: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
ed80: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
ed90: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
eda0: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
edb0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
edc0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
ede0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
edf0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
ee00: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
ee10: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
ee20: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
ee30: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
ee40: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
ee50: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
ee60: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
ee70: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
ee80: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
ee90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
eea0: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
eeb0: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
eec0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
eed0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
eee0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
eef0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
ef00: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
ef10: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
ef30: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
ef40: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
ef50: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
ef60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ef70: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
ef80: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
ef90: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
efa0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
efb0: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
efc0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
efd0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
efe0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
eff0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
f000: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
f010: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
f030: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f040: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
f050: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
f060: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
f070: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
f080: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
f090: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
f0b0: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
f0c0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
f0d0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
f0e0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
f0f0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
f100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
f110: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
f120: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
f130: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
f140: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
f150: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
f160: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
f170: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
f180: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
f190: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
f1a0: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
f1b0: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
f1c0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
f1d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1e0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
f1f0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
f200: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
f210: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f220: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
f230: 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
f240: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
f250: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
f260: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
f270: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
f280: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
f290: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
f2a0: 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
f2b0: 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
f2c0: 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
f2d0: 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
f2e0: 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
f2f0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
f300: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f310: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
f320: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
f330: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
f340: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
f350: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
f360: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
f370: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
f380: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
f390: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
f3a0: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
f3b0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
f3c0: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
f3d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f3e0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
f3f0: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
f400: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
f410: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
f420: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
f430: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
f440: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
f450: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
f460: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
f470: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
f480: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
f490: 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
f4a0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
f4b0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
f4c0: 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68  orary.** file wh
f4d0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
f4e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f4f0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
f500: 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
f510: 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
f520: 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
f530: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f540: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
f550: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
f560: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
f570: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
f580: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
f590: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
f5a0: 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
f5b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
f5c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f5d0: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
f5e0: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
f5f0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
f600: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f610: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
f620: 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
f630: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f640: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
f650: 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
f660: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
f670: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
f680: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
f690: 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
f6a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
f6b0: 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
f6c0: 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
f6d0: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
f6e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
f6f0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
f700: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f710: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
f720: 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c  erStress(void *,
f730: 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  PgHdr *);../*.**
f740: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
f750: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
f760: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
f780: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
f790: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
f7a0: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
f7b0: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
f7c0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
f7d0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
f7e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
f7f0: 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
f800: 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
f810: 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
f820: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
f830: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
f840: 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
f850: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
f860: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
f870: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
f880: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
f890: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
f8a0: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
f8b0: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
f8c0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
f8d0: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
f8e0: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
f8f0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
f900: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
f910: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
f920: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
f930: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
f940: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
f950: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
f960: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
f970: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
f980: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
f990: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
f9a0: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
f9b0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
f9c0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
f9d0: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
f9e0: 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
f9f0: 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
fa00: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fa10: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
fa20: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
fa30: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
fa40: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
fa50: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
fa60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
fa70: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
fa80: 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
fa90: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
faa0: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
fab0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
fac0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fae0: 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
faf0: 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
fb00: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
fb20: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
fb30: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
fb40: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
fb50: 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
fb60: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
fb70: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
fb80: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
fb90: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
fba0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
fbb0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
fbc0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
fbd0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
fbe0: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
fbf0: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
fc00: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
fc10: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
fc20: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
fc30: 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
fc40: 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63  leSize;.  int pc
fc50: 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
fc60: 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a  e3PcacheSize();.
fc70: 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74    int szPageDflt
fc80: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
fc90: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
fca0: 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
fcb0: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   0;.  int nPathn
fcc0: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
fcd0: 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
fce0: 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
fcf0: 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
fd00: 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
fd10: 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
fd20: 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
fd30: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
fd40: 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
fd50: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75   = sqlite3MemJou
fd60: 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a  rnalSize();.  }.
fd70: 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
fd80: 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55  t return is a NU
fd90: 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  LL pointer */.  
fda0: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
fdb0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
fdc0: 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
fdd0: 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
fde0: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
fdf0: 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
fe00: 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
fe10: 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
fe20: 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
fe30: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
fe40: 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
fe50: 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
fe60: 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
fe70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
fe80: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
fe90: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
fea0: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
feb0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
fec0: 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
fed0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
fee0: 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
fef0: 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
ff00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ff10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ff20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ff30: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
ff40: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
ff50: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
ff60: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
ff70: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
ff80: 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
ff90: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
ffa0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
ffb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ffc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
ffd0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
ffe0: 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
fff0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
10000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10010 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10020 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
10030 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10040 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
10050 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  thname = strlen(
10060 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
10070 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
10080 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
10090 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
100a0 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
100b0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
100c0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
100d0 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
100e0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
100f0 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53  e */.    pcacheS
10100 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20  ize      +      
10110 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
10120 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75  bject */.    jou
10130 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
10140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
10160 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
10170 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
10180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10190 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
101a0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
101b0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
101c0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
101d0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
101e0 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
101f0 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f   40            /
10200 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
10210 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
10220 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
10230 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
10240 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
10250 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
10260 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10270 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
10280 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 65  PCache = (PCache
10290 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
102a0 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26   pPtr = ((u8 *)&
102b0 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61  pPager[1]) + pca
102c0 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  cheSize;.  pPage
102d0 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
102e0 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
102f0 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
10300 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
10310 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
10320 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
10330 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
10340 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
10350 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile];.  pPager->
10360 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
10370 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
10380 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61  >szOsFile+journa
10390 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
103a0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
103b0 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
103c0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a  Vfs->szOsFile+2*
103d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
103e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
103f0 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
10400 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
10410 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
10420 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
10430 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
10440 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
10450 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
10460 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50  = pVfs;.  if( zP
10470 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
10480 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
10490 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
104a0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
104b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
104c0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
104d0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
104e0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
104f0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
10500 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
10510 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
10520 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
10530 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
10540 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a  ame - sizeof("-j
10550 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
10560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10570 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
10580 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
10590 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
105a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
105b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
105c0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
105d0 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
105f0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
10600 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
10610 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
10620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10630 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
10640 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
10650 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
10660 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
10670 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
10680 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
10690 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
106a0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
106b0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
106c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
106d0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
106e0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
106f0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
10700 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10710 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
10720 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
10730 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
10740 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
10750 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
10760 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
10770 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
10780 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
10790 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
107a0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
107b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
107c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
107d0 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
107e0 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
107f0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
10800 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
10810 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10820 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
10830 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
10840 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
10850 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53 69  Dflt = iSectorSi
10860 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
10870 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10880 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
10890 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
108a0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
108b0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
108c0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
108d0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
108e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
108f0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
10900 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
10910 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
10920 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
10930 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
10940 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
10950 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
10960 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
10970 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
10980 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
10990 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
109a0 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
109b0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
109c0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
109d0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
109e0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
109f0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
10a00 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65  ii>>8)) ) szPage
10a10 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
10a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
10a30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
10a40 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53  if( szPageDflt>S
10a50 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
10a60 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
10a70 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
10a80 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
10a90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10aa0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
10ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
10ac0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
10ad0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10ae0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
10af0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
10b00 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
10b10 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10b20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
10b30 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
10b40 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
10b50 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
10b60 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
10b70 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
10b80 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
10b90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
10ba0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
10bb0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
10bc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
10bd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
10be0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
10bf0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
10c00 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
10c10 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
10c20 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
10c30 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
10c40 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
10c50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
10c60 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
10c70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
10c80 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
10c90 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
10ca0 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
10cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10cc0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10cd0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10ce0 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c  Malloc(szPageDfl
10cf0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
10d00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
10d10 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
10d20 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
10d30 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
10d40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
10d50 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
10d60 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
10d70 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
10d80 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
10d90 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
10da0 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
10db0 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
10dc0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
10dd0 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
10de0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
10df0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10e00 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
10e10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10e20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
10e30 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
10e40 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
10e50 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45  EM:rc);.  }.  nE
10e60 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
10e70 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
10e80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
10e90 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
10ea0 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
10ed0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
10ee0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
10ef0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
10f00 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
10f10 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
10f20 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
10f30 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
10f40 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
10f50 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
10f60 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
10f70 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
10f80 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
10f90 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
10fa0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
10fb0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
10fc0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
10fd0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
10fe0 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  ;.  for(i=strlen
10ff0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
11000 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61  ory); i>0 && pPa
11010 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
11020 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
11030 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
11040 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
11050 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
11060 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
11070 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69  Journal[] */.  i
11080 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
11090 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
110a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
110b0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
110c0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
110d0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
110e0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
110f0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
11100 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   9);.  }else{.  
11110 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
11120 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  al = 0;.  }..  /
11130 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
11140 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
11150 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11160 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b  al = useJournal;
11170 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
11180 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
11190 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
111a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
111b0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
111c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
111d0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
111e0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
111f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11200 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
11210 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
11220 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66  eSize = szPageDf
11230 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  lt;.  /* pPager-
11240 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
11250 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
11260 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
11270 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
11280 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
11290 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
112a0 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
112b0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
112c0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
112d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
112e0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
112f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11300 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
11310 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
11320 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
11330 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
11340 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
11350 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
11360 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
11370 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
11380 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
11390 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
113a0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
113b0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
113c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
113d0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
113e0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
113f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
11400 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
11410 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11420 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
11430 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
11440 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
11450 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
11460 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
11470 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
11480 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
11490 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
114a0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
114b0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
114c0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
114d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
114e0 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
114f0 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
11500 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
11510 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
11520 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
11530 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11540 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
11550 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
11560 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11570 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
11580 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
11590 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
115a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
115b0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
115c0 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
115d0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
115e0 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  ||tempFile);.  s
115f0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11600 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
11610 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
11620 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
11630 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11640 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
11650 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
11660 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
11670 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
11680 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
11690 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
116a0 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
116b0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
116c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
116e0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
116f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
11700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11710 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65  Busyhandler(Page
11720 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48  r *pPager, BusyH
11730 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
11740 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  dler){.  pPager-
11750 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
11760 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a  pBusyHandler;.}.
11770 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
11780 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
11790 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
117a0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
117b0 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
117c0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
117d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
117e0 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
117f0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11800 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
11810 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
11820 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
11830 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
11840 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
11850 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
11860 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
11870 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
11880 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
11890 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
118a0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
118b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
118c0 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
118d0 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
118e0 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
118f0 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  e*)){.  pPager->
11900 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
11910 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
11920 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
11930 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
11940 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
11950 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
11960 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
11970 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
11980 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
11990 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
119a0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
119b0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
119c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
119d0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
119e0 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
119f0 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
11a00 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
11a10 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  de;.  if( rc==SQ
11a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
11a30 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
11a40 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
11a50 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
11a60 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
11a70 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
11a80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
11a90 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
11aa0 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
11ab0 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
11ac0 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26  pageSize .     &
11ad0 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & (pPager->memDb
11ae0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
11af0 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
11b00 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
11b10 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
11b20 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
11b30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
11b40 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
11b50 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
11b60 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
11b70 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
11b80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11b90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11bb0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
11bc0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
11bd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
11be0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
11bf0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
11c00 6d 44 62 20 29 20 73 65 74 53 65 63 74 6f 72 53  mDb ) setSectorS
11c10 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
11c20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
11c30 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
11c40 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
11c50 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
11c60 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
11c70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
11c80 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
11c90 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
11ca0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
11cb0 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
11cc0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
11cd0 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
11ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11cf0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
11d00 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
11d10 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
11d20 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
11d30 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
11d40 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
11d50 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
11d60 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
11d70 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
11d80 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
11d90 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
11da0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
11db0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
11dc0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
11dd0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
11de0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
11df0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
11e00 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
11e10 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
11e20 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
11e30 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
11e40 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
11e50 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
11e60 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
11e70 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
11e80 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
11e90 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
11ea0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
11eb0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
11ec0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
11ed0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
11ee0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
11ef0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
11f00 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
11f10 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
11f20 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
11f30 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
11f40 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
11f50 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
11f60 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
11f70 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
11f80 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
11f90 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
11fa0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
11fb0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
11fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11fd0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
11fe0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11ff0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
12000 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
12010 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
12020 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
12030 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
12040 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
12050 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
12060 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
12070 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12080 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
12090 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
120a0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
120b0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
120c0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
120d0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
120e0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
120f0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
12100 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
12110 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
12120 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
12130 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
12140 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
12150 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
12160 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
12170 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
12180 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
12190 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
121a0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
121b0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
121c0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
121d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
121e0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
121f0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
12200 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
12210 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
12220 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
12230 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
12240 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
12250 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
12260 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
12270 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
12280 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12290 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
122a0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
122b0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
122c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
122d0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
122e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
122f0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
12300 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12310 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
12320 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
12330 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
12340 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
12350 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
12360 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
12370 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
12380 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
12390 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
123a0 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
123b0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
123c0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
123d0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
123e0 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
123f0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12400 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
12410 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
12420 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
12430 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
12440 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
12450 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
12460 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
12470 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
12480 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
12490 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
124a0 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
124b0 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
124c0 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
124d0 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
124e0 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
124f0 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
12500 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
12510 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
12520 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
12530 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
12540 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
12550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
12560 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
12570 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
12580 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
12590 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
125a0 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
125b0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
125c0 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
125d0 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
125e0 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
125f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12600 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
12610 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
12620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12630 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
12640 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
12650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12660 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
12670 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12680 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
12690 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
126a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
126b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
126c0 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
126d0 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
126e0 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
126f0 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
12700 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
12710 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
12720 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
12730 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
12740 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
12750 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
12760 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
12770 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
12780 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
12790 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
127a0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
127b0 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
127c0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
127d0 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
127e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
127f0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
12800 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
12810 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a  ){.  i64 n = 0;.
12820 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
12830 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
12840 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12850 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
12860 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
12870 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
12880 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
12890 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
128a0 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
128b0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
128c0 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
128d0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
128e0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
128f0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
12900 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
12910 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
12920 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
12930 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
12940 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
12950 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
12960 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
12970 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
12980 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12990 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
129a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
129b0 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
129c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129d0 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
129e0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
129f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
12a00 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
12a10 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12a20 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
12a30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
12a40 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
12a50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
12a60 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
12a70 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d  .  if( n>pPager-
12a80 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
12a90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
12aa0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 50  n;.  }.  if( pnP
12ab0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61  age ){.    *pnPa
12ac0 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ge = n;.  }.  re
12ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
12af0 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
12b00 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
12b10 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
12b20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12b30 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
12b40 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
12b50 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
12b60 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
12b70 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
12b80 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
12b90 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
12ba0 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
12bb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
12bc0 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
12bd0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
12be0 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
12bf0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
12c00 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
12c10 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
12c20 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
12c30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12c40 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
12c50 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
12c60 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
12c70 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
12c80 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
12c90 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
12ca0 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
12cb0 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
12cc0 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
12cd0 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
12ce0 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
12cf0 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
12d00 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
12d10 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
12d20 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
12d30 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
12d40 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
12d50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
12d60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
12d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
12d80 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
12d90 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
12da0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12db0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
12dc0 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
12dd0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
12de0 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
12df0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
12e00 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
12e10 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
12e20 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
12e30 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
12e40 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
12e50 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12e60 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
12e70 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
12e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12e90 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12ea0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12eb0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
12ec0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
12ed0 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
12ee0 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
12ef0 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
12f00 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
12f10 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12f20 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
12f30 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
12f40 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
12f50 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
12f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
12f70 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
12f80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
12f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
12fa0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
12fb0 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
12fc0 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
12fd0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
12fe0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
12ff0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
13000 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
13010 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  <0 );..  if( pPa
13020 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
13030 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
13040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
13050 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
13060 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13070 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73  r ) pPager->pBus
13080 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20  yHandler->nBusy 
13090 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 0;.    do {.  
130a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
130b0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
130c0 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
130d0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
130e0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
130f0 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
13100 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
13110 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
13120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
13140 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
13150 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
13160 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
13170 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
13180 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
13190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
131a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
131b0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
131c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
131d0 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
131e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
131f0 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
13200 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
13210 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
13220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
13230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
13240 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
13250 44 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  D );..  sqlite3P
13260 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
13270 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
13280 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13290 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
132a0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
132b0 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3c 28  else if( nPage<(
132c0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
132d0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
132e0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
132f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13310 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
13320 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13330 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13340 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
13350 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ng. */.      rc 
13360 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
13370 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
13380 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
13390 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
133a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
133c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
133d0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
133e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
133f0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
13400 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
13410 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
13420 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
13430 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
13440 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
13450 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
13460 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
13470 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
13480 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13490 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
134a0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
134b0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
134c0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
134d0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
134e0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
134f0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
13500 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
13510 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
13520 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
13530 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
13540 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
13550 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
13560 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
13570 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
13580 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
13590 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
135a0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
135b0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
135c0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
135d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
135e0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
135f0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
13600 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
13610 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
13620 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
13630 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
13640 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
13650 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
13660 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
13670 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  er){..  disable_
13680 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
13690 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
136a0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
136b0 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
136c0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
136d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
136e0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
136f0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
13700 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
13710 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
13720 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
13730 72 29 3b 0a 20 20 7d 0a 20 20 65 6e 61 62 6c 65  r);.  }.  enable
13740 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13750 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
13760 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
13770 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
13780 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
13790 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
137a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
137b0 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
137c0 72 29 29 0a 20 20 69 66 28 20 70 50 61 67 65 72  r)).  if( pPager
137d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
137e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
137f0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13800 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
13810 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
13820 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
13830 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
13840 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
13850 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
13860 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13870 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
13880 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13890 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
138a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c   }.  sqlite3OsCl
138b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
138c0 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
138d0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
138e0 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
138f0 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
13900 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13910 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
13920 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
13930 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
13940 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69  * }.  */..  sqli
13950 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
13960 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
13970 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
13980 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
13990 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
139a0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
139b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
139c0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
139d0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
139e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
139f0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
13a00 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
13a10 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
13a20 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
13a30 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13a40 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
13a50 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
13a60 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
13a70 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
13a80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
13a90 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
13aa0 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
13ab0 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
13ac0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
13ad0 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
13ae0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
13af0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
13b00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
13b10 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
13b20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13b30 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
13b40 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
13b50 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
13b60 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
13b70 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
13b80 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
13b90 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
13ba0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
13bb0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
13bc0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
13bd0 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
13be0 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
13bf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
13c00 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
13c10 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
13c20 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
13c30 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13c40 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
13c50 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
13c60 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
13c70 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
13c80 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
13c90 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
13ca0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
13cb0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
13cc0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
13cd0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
13ce0 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
13cf0 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
13d00 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13d10 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
13d20 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13d30 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
13d40 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13d50 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
13d60 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
13d70 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
13d80 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
13d90 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
13da0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13db0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
13dc0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
13dd0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
13de0 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
13df0 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
13e00 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
13e10 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
13e20 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13e30 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
13e40 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
13e50 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
13e60 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
13e70 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
13e80 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
13e90 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
13ea0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
13eb0 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
13ec0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
13ed0 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
13ee0 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
13ef0 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
13f00 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
13f10 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
13f20 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
13f30 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
13f40 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
13f50 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
13f60 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
13f70 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
13f80 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
13f90 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
13fa0 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
13fb0 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
13fc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
13fd0 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
13fe0 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
13ff0 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
14000 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
14010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14020 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
14030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
14040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14050 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
14060 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
14070 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
14080 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
14090 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
140a0 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
140b0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
140c0 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
140d0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
140e0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
140f0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
14100 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
14110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14120 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
14130 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
14140 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
14150 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
14160 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
14170 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
14180 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
141a0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
141b0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
141c0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
141d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
141e0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
141f0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
14200 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
14210 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
14220 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
14230 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
14240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
14250 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
14260 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
14270 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
14280 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
14290 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
142a0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
142b0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
142c0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
142d0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
142e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
142f0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
14300 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
14310 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
14320 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
14330 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
14340 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
14350 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
14360 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
14370 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
14380 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
14390 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
143a0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
143b0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
143c0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
143d0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
143e0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
143f0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
14400 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
14410 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
14420 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
14430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14440 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
14450 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
14460 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
14470 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
14480 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
14490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
144a0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
144b0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
144c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
144d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
144e0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
144f0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
14500 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14510 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
14520 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
14530 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
14540 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14550 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
14570 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
14580 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
14590 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
145a0 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  gic);.        IO
145b0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
145c0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
145d0 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29  er, jrnlOff, 4))
145e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
145f0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
14600 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
14610 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
14620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
14630 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14640 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
14650 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
14660 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
14670 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
14680 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
14690 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
146a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
146b0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
146c0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
146d0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
146e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
146f0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14700 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
14710 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
14720 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
14730 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
14740 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
14750 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
14760 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
14770 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
14780 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14790 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
147a0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
147b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
147c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
147d0 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
147e0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
147f0 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
14800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
14810 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 46  ite3PcacheClearF
14820 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
14830 61 63 68 65 2c 20 50 47 48 44 52 5f 4e 45 45 44  ache, PGHDR_NEED
14840 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 23 69 66  _SYNC);.  }..#if
14850 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
14860 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
14870 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
14880 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
14890 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
148a0 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
148b0 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
148c0 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
148d0 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
148e0 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
148f0 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
14900 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
14910 65 41 73 73 65 72 74 46 6c 61 67 73 28 70 50 61  eAssertFlags(pPa
14920 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c  ger->pPCache, 0,
14930 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
14940 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
14950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14960 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
14970 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
14980 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
14990 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
149a0 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
149b0 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
149c0 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
149d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
149e0 6f 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65  o calls are made
149f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2d  .** to the page-
14a00 63 61 63 68 65 20 74 6f 20 6d 61 72 6b 20 74 68  cache to mark th
14a10 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e  e pages as clean
14a20 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14a30 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66  onsibility.** of
14a40 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75   the caller to u
14a50 73 65 20 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  se PcacheCleanAl
14a60 6c 28 29 20 6f 72 20 50 63 61 63 68 65 4d 61 6b  l() or PcacheMak
14a70 65 43 6c 65 61 6e 28 29 20 74 6f 20 6d 61 72 6b  eClean() to mark
14a80 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 73  .** the pages as
14a90 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
14aa0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
14ab0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
14ac0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
14ad0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
14ae0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
14af0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
14b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
14b10 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
14b20 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
14b30 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
14b40 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
14b50 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
14b60 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
14b70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14b80 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
14b90 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
14ba0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
14bb0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
14bc0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
14bd0 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
14be0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
14bf0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
14c00 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
14c10 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
14c20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
14c30 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
14c40 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14c50 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
14c60 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
14c70 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
14c80 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
14c90 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
14ca0 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
14cb0 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
14cc0 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
14cd0 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
14ce0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
14cf0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
14d00 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
14d10 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
14d20 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
14d30 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
14d40 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
14d50 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
14d60 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
14d70 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
14d80 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14d90 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
14da0 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
14db0 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
14dc0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
14dd0 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
14de0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
14df0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14e00 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
14e10 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
14e20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
14e30 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
14e40 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
14e50 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
14e60 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
14e70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
14e80 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
14e90 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
14ea0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14eb0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
14ec0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
14ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14ef0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c    }..  while( pL
14f00 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  ist ){..    /* I
14f10 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e  f the file has n
14f20 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
14f30 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
14f40 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
14f50 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14f60 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
14f70 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  t(pPager->tempFi
14f80 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  le);.      rc = 
14f90 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14fa0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
14fb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
14fc0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20  >vfsFlags);.    
14fd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14fe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
14ff0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
15000 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
15010 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
15020 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
15030 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
15040 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
15050 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
15060 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
15070 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
15080 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
15090 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
150a0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
150b0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
150c0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
150d0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
150e0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
150f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15100 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
15110 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
15120 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
15130 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
15140 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
15150 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d  offset = (pList-
15160 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
15170 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15180 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
15190 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
151a0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
151b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
151c0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
151d0 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE4("STORE %d pa
151e0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
151f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15200 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
15210 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
15220 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
15230 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20  hash(pList));.  
15240 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
15250 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
15260 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
15270 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
15280 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
15290 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
152a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
152b0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
152c0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
152d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
152e0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
152f0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
15300 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
15310 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
15320 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
15330 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
15340 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
15350 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
15360 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
15370 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
15380 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
15390 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
153a0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
153b0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
153c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
153d0 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
153e0 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
153f0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
15400 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64   return rc;.#ifd
15410 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
15420 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
15430 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
15440 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
15450 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
15460 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
15470 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
15480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
154a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
154b0 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
154c0 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
154d0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
154e0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
154f0 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  . The argument i
15500 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
15510 20 70 75 72 67 65 61 62 6c 65 20 50 61 67 65 72   purgeable Pager
15520 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69   .** object. Thi
15530 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
15540 70 74 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69  pts to make a si
15550 6e 67 6c 65 20 64 69 72 74 79 20 70 61 67 65 20  ngle dirty page 
15560 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f  that has no.** o
15570 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
15580 65 6e 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78  ences (if one ex
15590 69 73 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74  ists) clean so t
155a0 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
155b0 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68  cycled .** by th
155c0 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a  e pcache layer..
155d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
155e0 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
155f0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
15600 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
15610 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
15620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15630 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
15640 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a  r->doNotSync ){.
15650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15660 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  E_OK;.  }..  ass
15670 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
15680 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
15690 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
156a0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
156b0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
156c0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
156d0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72  _SYNC ){.      r
156e0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
156f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
15700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15710 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c   && pPager->full
15720 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20  Sync && .       
15730 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
15740 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
15750 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
15760 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 28 73  ) &&.        !(s
15770 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
15780 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
15790 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
157a0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
157b0 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ND).      ){.   
157c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
157d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
157e0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
157f0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
15800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15820 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
15830 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
15840 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
15850 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
15860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15880 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
15890 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
158a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
158b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
158c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
158d0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
158e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
158f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
15900 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69  urn 1 if there i
15910 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
15920 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
15930 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
15940 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
15950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
15960 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
15970 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
15980 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
15990 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
159a0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
159b0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
159c0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
159d0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
159e0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
159f0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
15a00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
15a10 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
15a20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15a30 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  ** Return negati
15a40 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  ve if unable to 
15a50 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74  determine the st
15a60 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  atus of the jour
15a70 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
15a80 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
15a90 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
15aa0 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  l file to examin
15ab0 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e its.** content
15ac0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f  .  Hence, the jo
15ad0 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
15ae0 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
15af0 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  a master.** jour
15b00 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61  nal file that ha
15b10 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
15b20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65  and hence not be
15b30 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65   hot.  Or.** the
15b40 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
15b50 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20  ournal might be 
15b60 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69  zeroed out.  Thi
15b70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
15b80 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74  s not discover t
15b90 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20  hese cases of a 
15ba0 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  non-hot journal 
15bb0 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  - if the.** jour
15bc0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
15bd0 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  and is not empty
15be0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   this routine as
15bf0 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68  sumes it.** is h
15c00 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70  ot.  The pager_p
15c10 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
15c20 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
15c30 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  that the.** jour
15c40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
15c50 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77  really hot and w
15c60 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ill no-op..*/.st
15c70 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
15c80 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
15c90 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
15ca0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
15cb0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
15cc0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
15cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15ce0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 69   int exists;.  i
15cf0 6e 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61 73 73  nt locked;.  ass
15d00 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
15d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15d20 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
15d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15d40 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
15d50 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d   );.  *pExists =
15d60 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
15d70 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
15d80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
15d90 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
15da0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
15db0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15dc0 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
15dd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15de0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
15df0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
15e00 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
15e10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
15e20 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
15e30 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
15e40 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20    int nPage;.   
15e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15e60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15e70 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
15e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15e90 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e  OK ){.     if( n
15ea0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
15eb0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
15ec0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
15ed0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
15ee0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15ef0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
15f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
15f30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
15f40 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
15f50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15f70 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
15f80 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
15f90 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
15fa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
15fb0 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
15fc0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
15fd0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
15fe0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
15ff0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
16000 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
16010 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
16020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16030 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
16040 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
16050 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
16060 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16070 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
16080 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
16090 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
160a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
160b0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47  , offset);.  PAG
160c0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
160d0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
160e0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
160f0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
16100 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
16110 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
16120 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69  ger, pgno));.  i
16130 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
16140 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
16150 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
16160 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
16170 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
161b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
161c0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
161d0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
161e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
161f0 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
16200 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
16210 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16230 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16240 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
16250 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
16260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16270 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16280 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16290 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
162a0 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
162b0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
162c0 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
162d0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
162e0 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
162f0 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
16300 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
16310 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
16320 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
16330 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
16340 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
16350 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16360 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
16370 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
16380 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f   checks for a ho
16390 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  t-journal file. 
163a0 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
163b0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
163c0 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72  llback.** is per
163d0 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65  formed immediate
163e0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
163f0 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
16400 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
16410 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16420 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73  ITE_OK;.  int is
16430 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a  ErrorReset = 0;.
16440 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
16450 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
16460 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
16470 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
16480 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
16490 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
164a0 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
164b0 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
164c0 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63   the chance to c
164d0 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
164e0 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
164f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16500 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
16510 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20   treat any.  ** 
16520 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
16530 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e as a hot-journ
16540 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  al..  */.  if( !
16550 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
16560 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
16570 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
16580 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
16590 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
165a0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
165b0 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  de .  ){.    if(
165c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
165d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
165e0 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
165f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
16600 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
16610 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
16620 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
16630 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16640 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
16650 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
16660 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
16670 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
16680 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
16690 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
166a0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
166b0 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
166c0 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
166d0 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
166e0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
166f0 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
16700 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
16710 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
16720 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
16730 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
16740 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
16750 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
16760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16770 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
16780 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
16790 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
167a0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
167b0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
167c0 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 3b 0a  t isHotJournal;.
167d0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
167e0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
167f0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
16800 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
16810 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
16820 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
16830 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
16840 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
16850 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
16860 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
16870 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
168a0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
168b0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
168c0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
168d0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
168e0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
168f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16900 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
16910 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  LOCK );.    }.. 
16920 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
16930 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
16940 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
16950 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
16960 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
16970 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16980 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16990 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
169a0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
169b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
169c0 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
169d0 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
169e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
169f0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  isHotJournal);. 
16a00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16a20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
16a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16a40 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65   if( isErrorRese
16a50 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61  t || isHotJourna
16a60 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
16a70 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16a80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16a90 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16aa0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16ab0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
16ac0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
16ad0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16ae0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16af0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16b00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16b10 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
16b20 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
16b30 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
16b40 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16b50 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16b60 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
16b70 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
16b80 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
16b90 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
16ba0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
16bb0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
16bc0 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
16bd0 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
16be0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
16bf0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
16c00 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
16c10 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16c20 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16c30 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
16c40 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
16c50 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
16c60 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
16c70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74   to.      ** obt
16c80 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
16c90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16cb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16cc0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16cd0 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
16ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16cf0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16d00 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16d10 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16d20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16d30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16d40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
16d50 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16d60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
16d70 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
16d80 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16d90 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16da0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
16db0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
16dc0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16dd0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
16de0 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
16df0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
16e00 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
16e10 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
16e20 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
16e30 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
16e40 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
16e50 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
16e60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
16e70 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
16e80 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
16e90 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
16ea0 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
16eb0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
16ec0 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
16ed0 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
16ee0 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
16ef0 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
16f00 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
16f10 52 65 73 65 74 20 26 26 20 70 50 61 67 65 72 2d  Reset && pPager-
16f20 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
16f30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
16f40 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
16f50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
16f60 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
16f70 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
16f80 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
16f90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
16fc0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
16fd0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
16fe0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
16ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
17000 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
17010 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
17020 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
17030 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
17040 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
17050 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17060 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
17070 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
17080 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
17090 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
170a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
170b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
170c0 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
170d0 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
170e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
170f0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
17100 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17110 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
17120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17130 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
17140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17150 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
17160 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
17170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
17180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
17190 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
171a0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
171b0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f  t, that means so
171c0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
171d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
171e0 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
171f0 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
17200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
17210 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
17260 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
17270 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
17280 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
17290 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
172a0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
172b0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
172c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
172d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
172e0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
172f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17300 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
17310 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
17320 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
17330 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
17340 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
17350 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
17360 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
17370 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
17380 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
17390 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
173a0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
173b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
173c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
173d0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
173e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
173f0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
17400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
17410 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
17420 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
17430 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
17440 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17450 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
17460 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
17470 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
17480 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
17490 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
174a0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
174b0 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
174c0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
174d0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
174e0 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
174f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
17500 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
17510 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
17520 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
17530 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
17540 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
17550 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
17560 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
17570 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
17580 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
17590 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
175a0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
175b0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
175c0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
175d0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
175e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
175f0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
17600 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
17610 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
17620 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
17630 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
17640 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
17650 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
17660 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
17670 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
17680 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
17690 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
176a0 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
176b0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
176c0 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
176d0 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
176e0 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
176f0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
17700 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
17710 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
17720 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
17730 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
17740 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
17750 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
17760 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
17770 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
17780 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
17790 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
177a0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
177b0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
177c0 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
177d0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
177e0 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
177f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17800 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
17810 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17820 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a  nt(pPager, 0);..
17830 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
17840 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
17850 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
17860 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
17870 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17880 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
17890 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
178a0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
178b0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
178c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
178d0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
178e0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
178f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17900 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
17910 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
17920 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
17930 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
17940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17950 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
17960 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
17970 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
17980 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
17990 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
179a0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
179b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
179c0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
179d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
179e0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
179f0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
17a00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
17a10 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17a20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
17a30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
17a40 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
17a50 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
17a60 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52  tate<=PAGER_SHAR
17a70 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
17a80 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
17a90 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
17aa0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17ab0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
17ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69  .    }.  }.. fai
17ad0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
17ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17af0 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  /* pager_unlock(
17b00 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
17b10 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
17b20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
17b30 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
17b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
17b50 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
17b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17b70 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
17b80 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  e the content fo
17b90 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68  r a page.  If th
17ba0 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72  e page was.** pr
17bb0 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
17bc0 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
17bd0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ==1, then the co
17be0 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73  ntent was.** jus
17bf0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  t initialized to
17c00 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f   zeros instead o
17c10 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
17c20 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e  m disk..** But n
17c30 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65 20 72  ow we need the r
17c40 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20  eal data off of 
17c50 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73  disk.  So make s
17c60 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69  ure we.** have i
17c70 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20 69  t.  Read it in i
17c80 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  f we do not have
17c90 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a   it already..*/.
17ca0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17cb0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48  _get_content(PgH
17cc0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
17cd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
17ce0 5f 4e 45 45 44 5f 52 45 41 44 20 29 7b 0a 20 20  _NEED_READ ){.  
17cf0 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44    int rc = readD
17d00 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65  bPage(pPg->pPage
17d10 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e  r, pPg, pPg->pgn
17d20 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
17d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17d40 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17d50 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17d60 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
17d70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17d80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17da0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
17db0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
17dc0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 61   reached zero, a
17dd0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
17de0 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69  not in the.** mi
17df0 64 64 6c 65 20 6f 66 20 61 20 77 72 69 74 65 20  ddle of a write 
17e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f  transaction or o
17e10 70 65 6e 65 64 20 69 6e 20 65 78 63 6c 75 73 69  pened in exclusi
17e20 76 65 20 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20  ve mode, unlock 
17e30 69 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  it..*/ .static v
17e40 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
17e50 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
17e60 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
17e70 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
17e80 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
17e90 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 20 26 26  ache)==0).    &&
17ea0 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
17eb0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
17ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
17ed0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
17ee0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
17ef0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
17f00 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20  }../*.** Drop a 
17f10 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61  page from the ca
17f20 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  che using sqlite
17f30 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a  3PcacheDrop()..*
17f40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61  *.** If this mea
17f50 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77  ns there are now
17f60 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72   no pages with r
17f70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
17f80 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  m, a rollback.**
17f90 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
17fa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17fb0 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e  base is removed.
17fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17fd0 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62  pagerDropPage(Db
17fe0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
17ff0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
18000 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c  g->pPager;.  sql
18010 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
18020 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  Pg);.  pagerUnlo
18030 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
18040 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  r);.}../*.** Acq
18050 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
18060 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
18070 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
18080 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
18090 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
180a0 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
180b0 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
180c0 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
180d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
180e0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
180f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
18100 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
18110 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
18120 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
18130 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
18140 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
18150 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
18160 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
18170 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
18180 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
18190 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
181a0 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
181b0 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
181c0 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
181d0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
181e0 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
181f0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
18200 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
18210 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
18220 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
18230 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
18240 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
18250 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
18260 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
18270 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
18280 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
18290 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
182a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
182b0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
182c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
182d0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
182e0 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
182f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
18300 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
18310 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
18320 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
18330 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
18340 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
18350 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
18360 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
18370 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
18380 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
18390 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
183a0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
183b0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
183c0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
183d0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
183e0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
183f0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
18400 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
18410 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
18420 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
18430 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
18440 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
18450 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
18460 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
18470 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
18480 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
18490 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  s..**.** If noCo
184a0 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ntent is false, 
184b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
184c0 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72  s are actually r
184d0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
184e0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
184f0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
18500 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
18510 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
18520 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
18530 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
18540 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64  ime, so do not d
18550 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20  o a disk read.  
18560 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
18570 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  .** page content
18580 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75   with zeros.  Bu
18590 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20  t mark the fact 
185a0 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74  that we have not
185b0 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e   read the.** con
185c0 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20  tent by setting 
185d0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
185e0 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20  ad flag.  Later 
185f0 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74  on, if .** sqlit
18600 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
18610 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  s called on this
18620 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69 73   page or if this
18630 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63   routine is.** c
18640 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68  alled again with
18650 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74   noContent==0, t
18660 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
18670 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65  he content is ne
18680 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eded.** and the 
18690 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64  disk read should
186a0 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
186b0 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
186c0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
186d0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
186e0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
186f0 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
18700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
18710 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
18720 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
18730 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
18740 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
18750 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
18760 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
18770 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
18780 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
18790 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
187a0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
187b0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
187c0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
187d0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
187e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
187f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18800 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
18810 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  K .       || sql
18820 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
18830 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
18840 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c  he)>0 .       ||
18850 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20   pgno==1.  );.. 
18860 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
18870 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
18880 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
18890 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
188a0 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
188b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
188c0 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
188d0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
188e0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
188f0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
18900 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
18910 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
18920 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
18930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18940 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
18950 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
18960 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
18970 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
18980 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
18990 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
189a0 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f  ppPage = 0;..  /
189b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
189c0 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
189d0 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
189e0 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
189f0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
18a00 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
18a10 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
18a20 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
18a30 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
18a40 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
18a50 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
18a60 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
18a70 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
18a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18a90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
18aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18ab0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
18ac0 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  OCK );..  rc = s
18ad0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
18ae0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
18af0 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67  e, pgno, 1, &pPg
18b00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18b20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
18b30 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  f( pPg->pPager==
18b40 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
18b50 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
18b60 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
18b70 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
18b80 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
18b90 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
18ba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
18bb0 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f  nMax;.    PAGER_
18bc0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
18bd0 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  ss);.    pPg->pP
18be0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
18bf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 69     if( sqlite3Bi
18c00 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
18c10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
18c20 6f 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  o) ){.      pPg-
18c30 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
18c40 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
18c50 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
18c60 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
18c70 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a 20  ger->nExtra);.. 
18c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18c90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
18ca0 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
18cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
18cd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
18ce0 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
18cf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
18d00 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
18d10 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
18d20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
18d30 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
18d40 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
18d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18d60 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
18d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18d80 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
18d90 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
18da0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
18db0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18dc0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
18dd0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
18de0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
18df0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
18e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
18e10 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
18e20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
18e30 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
18e40 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
18e50 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
18e60 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
18e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18e80 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
18e90 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18ea0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  D ){.        /* 
18eb0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18ec0 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20 20 20 20  f(pPg); */.     
18ed0 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65     pagerDropPage
18ee0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
18ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18f00 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
18f10 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
18f20 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
18f30 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
18f40 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
18f50 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
18f60 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
18f70 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
18f80 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
18f90 20 20 61 73 73 65 72 74 28 73 71 6c 69 74 65 33    assert(sqlite3
18fa0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
18fb0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
18fc0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
18fd0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
18fe0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
18ff0 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
19000 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
19010 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
19020 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
19030 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rc ){.        sq
19040 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19050 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
19060 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
19080 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72  pPage = pPg;.  r
19090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
190a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
190b0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
190c0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
190d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
190e0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
190f0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
19100 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
19110 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
19120 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
19130 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19140 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
19150 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
19160 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
19170 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
19180 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
19190 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
191a0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
191b0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
191c0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
191d0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
191e0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
191f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
19200 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
19210 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
19220 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
19230 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
19240 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
19250 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
19260 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
19270 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
19280 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
19290 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
192a0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
192b0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
192c0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
192d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
192e0 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
192f0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d  (pPager->state!=
19300 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20  PAGER_UNLOCK).  
19310 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72   && (pPager->err
19320 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
19330 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
19340 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  de==SQLITE_FULL)
19350 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
19360 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
19370 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
19380 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
19390 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  }..  return pPg;
193a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
193b0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
193c0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
193d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
193e0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
193f0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
19400 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
19410 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
19420 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
19430 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
19440 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
19450 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
19460 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
19470 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19480 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
19490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
194a0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
194b0 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
194c0 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
194d0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
194e0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
194f0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
19500 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
19510 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
19520 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
19530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19540 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
19550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19560 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
19570 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
19580 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
19590 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
195a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
195b0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
195c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
195d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
195e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
195f0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
19600 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19610 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
19620 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
19630 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
19640 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
19650 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
19660 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
19670 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
19680 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
19690 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
196a0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
196b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
196c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
196d0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
196e0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69  EN_CREATE);..  i
196f0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
19700 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
19710 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
19720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19730 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
19740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19750 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
19760 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
19770 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
19780 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  ger, 0);.  pPage
19790 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
197a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
197b0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
197c0 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze);.  if( pPage
197d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
197e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
197f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
19800 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
19810 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
19820 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
19830 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
19840 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19850 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
19860 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
19870 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
19880 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
19890 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
198a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
198b0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
198c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
198d0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
198e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
198f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
19900 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
19910 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
19920 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
19930 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
19940 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19950 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
19960 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19970 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
19980 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ITE.      rc = s
19990 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
199a0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66  n(.          pVf
199b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
199c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
199d0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
199e0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
199f0 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
19a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19a10 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
19a20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
19a30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
19a40 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
19a50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
19a70 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
19a80 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70  Methods );.    p
19a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19aa0 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
19ab0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
19ac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
19ad0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
19ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
19b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
19b10 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M ){.        sql
19b20 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
19b30 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
19b40 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
19b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
19b60 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19b70 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  al;.    }.  }.  
19b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19b90 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
19ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19bb0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
19bc0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
19bd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
19be0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
19bf0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19c00 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19c10 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
19c20 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19c30 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
19c40 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
19c50 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19c60 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
19c70 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
19c80 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19c90 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
19ca0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19cb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19cc0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
19cd0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
19ce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19cf0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
19d00 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
19d10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
19d20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
19d30 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
19d40 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
19d50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19d70 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
19d80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19d90 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
19da0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
19db0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
19dc0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
19dd0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
19de0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19df0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
19e00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
19e10 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
19e20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19e30 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
19e40 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
19e50 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
19e60 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
19e70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
19e80 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19e90 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
19ea0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
19eb0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19ec0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19ed0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19ee0 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
19ef0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
19f00 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
19f10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
19f20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
19f30 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
19f40 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
19f50 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
19f60 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
19f70 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
19f80 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
19f90 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
19fa0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
19fb0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
19fc0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
19fd0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
19fe0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
19ff0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1a000 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1a010 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1a020 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1a030 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1a040 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1a050 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1a060 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1a070 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1a080 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1a090 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a0a0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1a0b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1a0c0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1a0d0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1a0e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a0f0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1a100 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1a110 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1a120 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1a130 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1a140 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a150 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1a160 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1a170 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1a180 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1a190 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1a1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1a1b0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1a1c0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1a1d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a1e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1a1f0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1a200 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1a210 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1a220 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1a230 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1a240 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1a250 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1a260 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1a270 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1a280 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1a290 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1a2a0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1a2b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1a2c0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1a2d0 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1a2e0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1a2f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1a300 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1a310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a320 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1a330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a340 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1a350 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1a360 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1a370 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1a380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a390 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1a3a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a3b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73   !MEMDB );.    s
1a3c0 71 6c 69 74 65 33 50 63 61 63 68 65 41 73 73 65  qlite3PcacheAsse
1a3d0 72 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  rtFlags(pPager->
1a3e0 70 50 43 61 63 68 65 2c 20 30 2c 20 50 47 48 44  pPCache, 0, PGHD
1a3f0 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  R_IN_JOURNAL);. 
1a400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a410 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1a420 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1a430 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a450 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1a460 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1a470 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61  .      if( exFla
1a480 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
1a490 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1a4a0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1a4b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1a4c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a4d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a4e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1a4f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a500 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1a510 68 65 20 3d 20 30 3b 0a 20 20 20 20 50 41 47 45  he = 0;.    PAGE
1a520 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
1a530 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1a540 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
1a560 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
1a570 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1a580 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
1a590 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
1a5a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1a5b0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
1a5c0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1a5d0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1a5e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1a5f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a600 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1a610 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
1a620 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
1a630 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
1a640 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
1a650 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1a660 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  de the last.    
1a670 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1a680 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1a690 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1a6a0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1a6b0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1a6c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1a6d0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1a6e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a6f0 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1a700 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69  kept open and ei
1a710 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74  ther was truncat
1a720 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72  ed to 0 bytes or
1a730 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a   its header was.
1a740 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74      ** overwritt
1a750 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  en with zeros.. 
1a760 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a770 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
1a780 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a790 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a7a0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
1a7b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1a7c0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1a7d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1a7e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1a7f0 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
1a800 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
1a810 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1a820 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
1a830 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  e );.    if( !pP
1a840 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1a850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1a880 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a890 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1a8a0 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  e;.      rc = wr
1a8b0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1a8c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1a8d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1a8e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a8f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1a900 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
1a910 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
1a920 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a930 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
1a940 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
1a950 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
1a960 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
1a970 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
1a980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1a990 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
1a9a0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
1a9b0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
1a9c0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  g);.}../*.** Mak
1a9d0 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
1a9e0 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
1a9f0 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
1aa00 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
1aa10 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
1aa20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1aa30 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
1aa40 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
1aa50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
1aa60 50 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  Pg);.}.../*.** M
1aa70 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
1aa80 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
1aa90 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
1aaa0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1aab0 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1aac0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1aad0 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1aae0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1aaf0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1ab00 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1ab10 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1ab20 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1ab30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ab40 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1ab50 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1ab60 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1ab70 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1ab80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ab90 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1aba0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1abb0 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1abc0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1abd0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1abe0 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1abf0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1ac00 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1ac10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1ac20 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1ac30 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1ac40 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1ac50 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1ac60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1ac70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1ac80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1ac90 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1aca0 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1acb0 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1acc0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1acd0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1ace0 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1acf0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1ad00 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1ad10 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1ad20 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1ad30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1ad40 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1ad50 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ad60 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1ad70 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1ad80 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1ad90 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1ada0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1adb0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1adc0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
1add0 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
1ade0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1adf0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1ae00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1ae10 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1ae20 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1ae30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1ae40 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1ae50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1ae60 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1ae70 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1ae80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1ae90 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1aea0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1aeb0 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1aec0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1aed0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1aee0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1aef0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1af00 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74  Content==1, that
1af10 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64   means.  ** we d
1af20 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61  idn't really rea
1af30 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
1af40 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54   of the page.  T
1af50 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20  his can happen. 
1af60 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65   ** (for example
1af70 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  ) when the page 
1af80 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  is being moved t
1af90 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  o the freelist. 
1afa0 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65   But.  ** now we
1afb0 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d   are (perhaps) m
1afc0 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f  oving the page o
1afd0 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ff of the freeli
1afe0 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73  st for.  ** reus
1aff0 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  e and we need to
1b000 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e   know its origin
1b010 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68  al content so th
1b020 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  at content.  ** 
1b030 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1b040 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1b050 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68  urnal.  So do th
1b060 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20  e read at this. 
1b070 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20   ** time..  */. 
1b080 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1b090 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1b0a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1b0b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1b0c0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1b0d0 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1b0e0 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1b0f0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1b100 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1b110 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1b120 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1b130 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
1b140 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
1b150 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
1b160 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  DR_IN_JOURNAL). 
1b170 20 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74    && (pageInStat
1b180 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
1b190 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
1b1a0 3d 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 50  =0) .  ){.    pP
1b1b0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1b1c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1b1d0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
1b1e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1b1f0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1b200 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1b210 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1b220 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1b230 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b240 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b250 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1b260 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1b270 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1b280 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1b290 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1b2a0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1b2b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1b2c0 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1b2d0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1b2e0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1b2f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b300 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1b310 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1b320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1b330 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1b340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1b360 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b380 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1b390 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1b3a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1b3b0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1b3c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
1b3d0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
1b3e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1b3f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1b400 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
1b410 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1b420 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1b430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b440 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b450 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1b460 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b470 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1b480 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
1b490 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
1b4a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1b4b0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
1b4c0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
1b4d0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
1b4e0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1b4f0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
1b500 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
1b510 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1b520 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
1b530 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b540 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
1b550 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1b560 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
1b570 66 28 20 21 28 70 50 67 2d 3e 66 6c 61 67 73 26  f( !(pPg->flags&
1b580 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
1b590 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
1b5a0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1b5b0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1b5c0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1b5d0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1b5e0 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
1b5f0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1b600 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
1b610 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
1b620 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
1b630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1b640 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
1b650 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
1b660 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
1b670 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
1b680 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
1b690 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
1b6a0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
1b6b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b6c0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
1b6d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1b6e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74   );.        pDat
1b6f0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1b700 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1b710 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
1b720 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1b730 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1b740 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1b750 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1b760 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
1b770 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
1b780 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
1b790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b7a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b7b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1b7c0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1b7d0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
1b7e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b7f0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b820 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
1b830 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b840 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
1b850 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
1b860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b890 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1b8a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1b8b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b8c0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
1b8d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b8e0 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
1b8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
1b900 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
1b910 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
1b920 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1b930 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
1b940 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b950 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
1b960 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
1b970 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1b980 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1b990 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
1b9a0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35       PAGERTRACE5
1b9b0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1b9c0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
1b9d0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1b9f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1ba00 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
1ba10 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
1ba20 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1ba30 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
1ba40 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1ba50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
1ba60 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
1ba70 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
1ba80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1ba90 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  he .        ** t
1baa0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1bab0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1bac0 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1bad0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1bae0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1baf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bb00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bb10 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1bb20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
1bb30 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1bb40 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1bb50 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1bb60 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
1bb70 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1bb80 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
1bb90 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1bba0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1bbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1bbc0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1bbd0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
1bbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1bbf0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1bc00 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
1bc10 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
1bc20 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
1bc30 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
1bc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1bc60 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1bc70 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
1bc80 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1bc90 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1bca0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1bcb0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1bcc0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1bcd0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1bce0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1bcf0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1bd00 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1bd10 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1bd20 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
1bd30 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
1bd40 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1bd50 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20 20 20 20  NC)?1:0));.     
1bd60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1bd70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1bd80 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1bd90 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1bda0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1bdb0 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1bdc0 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  s |= PGHDR_IN_JO
1bdd0 55 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 0a  URNAL;.    }.  .
1bde0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1bdf0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1be00 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1be10 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1be20 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1be30 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1be40 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1be50 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1be60 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1be70 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1be80 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1be90 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1bea0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1beb0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1bec0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1bed0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1bee0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1bef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1bf00 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
1bf10 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53       && !pageInS
1bf20 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
1bf30 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d      && (int)pPg-
1bf40 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1bf50 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a  tmtSize .    ){.
1bf60 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
1bf70 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
1bf80 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
1bf90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1bfa0 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1bfb0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1bfc0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1bfd0 37 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  7);.      assert
1bfe0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
1bff0 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  HDR_IN_JOURNAL) 
1c000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c010 20 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70    || (int)pPg->p
1c020 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1c030 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
1c040 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1c050 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f  (pPager->stfd, o
1c060 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
1c070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c0a0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c0b0 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1c0c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c0d0 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
1c0e0 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
1c0f0 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1c100 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1c110 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c120 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1c130 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1c140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1c170 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
1c180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c190 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d  Pager->pInStmt!=
1c1a0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1c1b0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1c1c0 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1c1d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
1c1e0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1c1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1c200 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
1c210 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c220 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c230 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
1c240 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1c250 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
1c260 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1c270 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
1c280 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
1c290 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
1c2a0 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
1c2b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c2c0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c2d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c2e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c2f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c300 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
1c310 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
1c320 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
1c330 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
1c340 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
1c350 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
1c360 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1c370 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
1c380 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
1c390 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
1c3a0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
1c3b0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1c3c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c3d0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
1c3e0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
1c3f0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
1c400 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
1c410 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
1c420 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
1c430 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
1c440 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
1c450 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
1c460 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
1c470 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
1c480 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1c490 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1c4a0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
1c4b0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
1c4c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
1c4d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
1c4e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c4f0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
1c500 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1c510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c520 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c530 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
1c540 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
1c550 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
1c560 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
1c570 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
1c580 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1c590 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1c5a0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1c5b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c5c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1c5d0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1c600 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1c610 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1c620 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1c630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c650 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1c660 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1c670 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
1c680 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
1c690 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
1c6a0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1c6b0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1c6c0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1c6d0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1c6e0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1c6f0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1c700 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1c710 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1c720 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1c730 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c740 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
1c750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1c760 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1c770 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1c780 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1c790 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1c7a0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1c7b0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1c7c0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1c7d0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1c7e0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1c7f0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1c800 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1c810 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1c820 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1c830 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1c840 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1c850 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1c860 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1c870 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1c880 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1c890 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c8a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
1c8b0 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
1c8c0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1c8d0 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1c8e0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1c8f0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1c900 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1c910 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1c920 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1c930 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1c940 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1c950 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1c960 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1c970 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1c980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1c990 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1c9a0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1c9b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1c9c0 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1c9d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1c9e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1c9f0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1ca00 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1ca10 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1ca20 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
1ca30 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
1ca40 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
1ca50 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
1ca60 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1ca70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
1ca80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1ca90 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1caa0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1cab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cac0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1cad0 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1cae0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1caf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1cb10 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1cb20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1cb30 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
1cb40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1cb50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1cb60 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1cb70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1cb80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cb90 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1cba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cbb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cbc0 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
1cbd0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1cbe0 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
1cbf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1cc00 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1cc10 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1cc20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1cc30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1cc40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1cc50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1cc60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1cc80 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1cc90 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
1cca0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
1ccb0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
1ccc0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
1ccd0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
1cce0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
1ccf0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
1cd00 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
1cd10 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
1cd20 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
1cd30 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
1cd40 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1cd50 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
1cd60 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
1cd70 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
1cd80 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
1cd90 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
1cda0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
1cdb0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1cdc0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1cdd0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
1cde0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1cdf0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1ce00 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
1ce10 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1ce20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1ce30 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1ce40 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1ce50 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1ce60 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1ce70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1ce80 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1ce90 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1cea0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1ceb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cec0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1ced0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1cee0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1cef0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1cf00 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1cf10 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1cf20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1cf30 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1cf40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1cf50 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1cf60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cf70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cf80 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1cf90 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1cfa0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1cfb0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1cfc0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1cfd0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1cfe0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1cff0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1d000 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1d010 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1d020 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1d030 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1d040 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1d050 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1d060 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1d070 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d080 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1d090 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1d0a0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1d0b0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1d0c0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1d0d0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1d0e0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1d0f0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1d100 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1d110 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1d120 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1d130 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1d140 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
1d150 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
1d160 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
1d170 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
1d180 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
1d190 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
1d1a0 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
1d1b0 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
1d1c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1d1d0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1d1e0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1d1f0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1d200 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1d210 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1d220 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1d230 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1d240 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1d250 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1d260 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1d270 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1d280 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1d290 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1d2a0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1d2b0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1d2c0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d2d0 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1d2e0 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1d2f0 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1d300 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1d310 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1d320 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1d330 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1d340 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1d350 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1d360 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1d370 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1d380 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1d390 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1d3a0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d3b0 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1d3c0 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1d3d0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1d3e0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1d3f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1d400 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1d410 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1d420 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1d430 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1d440 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1d450 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1d460 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1d470 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1d480 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1d490 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1d4a0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1d4b0 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1d4c0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1d4d0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1d4e0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1d4f0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1d500 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1d510 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1d520 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1d530 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d540 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1d550 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1d560 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1d570 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1d580 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1d590 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1d5a0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1d5b0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1d5c0 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1d5d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1d5e0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1d5f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1d600 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1d610 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1d620 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1d630 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1d640 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d650 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1d660 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1d670 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d680 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
1d690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d6a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1d6b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30  lwaysRollback==0
1d6c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d6d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1d6e0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1d6f0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d700 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  k = sqlite3Bitve
1d710 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1d720 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20  origDbSize);.   
1d730 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41   if( !pPager->pA
1d740 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1d750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d760 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d770 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
1d780 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1d790 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d7a0 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f  lback, pPg->pgno
1d7b0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1d7c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d  LITE_OK && (pPg-
1d7d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d7e0 54 59 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e  TY) && !pPager->
1d7f0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d800 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d810 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1d820 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1d830 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1d840 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1d850 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1d860 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1d870 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1d880 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1d890 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1d8a0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1d8b0 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1d8c0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1d8d0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1d8e0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1d8f0 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1d900 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1d910 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1d920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1d930 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1d940 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1d950 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1d960 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1d970 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1d980 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1d990 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1d9a0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1d9b0 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1d9c0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1d9d0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1d9e0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1d9f0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1da00 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1da10 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1da20 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1da30 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1da40 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1da50 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1da60 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1da70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1da80 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1da90 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1daa0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1dab0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1dac0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
1dad0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
1dae0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1daf0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
1db00 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1db10 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
1db20 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
1db30 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1db40 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1db50 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1db60 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1db70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1db80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1db90 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1dba0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1dbb0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
1dbc0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
1dbd0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
1dbe0 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
1dbf0 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
1dc00 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
1dc10 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
1dc20 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
1dc30 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
1dc40 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
1dc50 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
1dc60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1dc70 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65  **.** If we have
1dc80 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c   not yet actuall
1dc90 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  y read the conte
1dca0 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  nt of this page 
1dcb0 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72  (if.** the PgHdr
1dcc0 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69  .needRead flag i
1dcd0 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73  s set) then this
1dce0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
1dcf0 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68   a promise.** th
1dd00 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  at we will never
1dd10 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   need to read th
1dd20 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1dd30 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a  n the future..**
1dd40 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64   so the needRead
1dd50 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65   flag can be cle
1dd60 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ared at this poi
1dd70 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1dd80 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1dd90 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67  back(DbPage *pPg
1dda0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1ddb0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1ddc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ddd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1dde0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20  R_RESERVED );.. 
1ddf0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1de00 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  al file is not o
1de10 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74  pen, or DontWrit
1de20 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
1de30 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73  led on.  ** this
1de40 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65   page (DontWrite
1de50 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61  () sets the alwa
1de60 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29  ysRollback flag)
1de70 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a  , then this.  **
1de80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1de90 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1dea0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1deb0 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Open==0 .   || s
1dec0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
1ded0 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
1dee0 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
1def0 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  gno).   || pPg->
1df00 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1df10 67 44 62 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20  gDbSize.  ){.   
1df20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69   return;.  }..#i
1df30 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
1df40 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20  RE_DELETE.  if( 
1df50 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
1df60 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 21  HDR_IN_JOURNAL)!
1df70 3d 30 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  =0 || (int)pPg->
1df80 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1df90 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
1dfa0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
1dfb0 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
1dfc0 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
1dfd0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
1dfe0 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
1dff0 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
1e000 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1e010 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
1e020 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
1e030 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
1e040 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
1e050 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
1e060 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
1e070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
1e080 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
1e090 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
1e0a0 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
1e0b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1e0c0 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
1e0d0 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a  ust be met..  **
1e0e0 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20  .  ** (Later:)  
1e0f0 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68  Not true.  If th
1e100 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
1e110 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e  rrupted by havin
1e120 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a  g duplicate.  **
1e130 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1e140 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72  eelist (ex: corr
1e150 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20  upt9.test) then 
1e160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1e170 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
1e180 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f  arily true:.  */
1e190 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70  .  /* assert( !p
1e1a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1e1b0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1e1c0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1e1d0 62 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61  bSize ); */..  a
1e1e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e1f0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1e200 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
1e210 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
1e220 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
1e230 29 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  );.  pPg->flags 
1e240 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  |= PGHDR_IN_JOUR
1e250 4e 41 4c 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67  NAL;.  pPg->flag
1e260 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
1e270 5f 52 45 41 44 3b 0a 20 20 69 66 28 20 70 50 61  _READ;.  if( pPa
1e280 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1e290 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e2a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3e  ager->stmtSize >
1e2b0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1e2c0 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  Size );.    sqli
1e2d0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1e2e0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
1e2f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
1e300 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1e310 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1e320 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1e330 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1e340 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
1e350 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
1e360 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e370 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a  pPg->pgno)).}...
1e380 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e390 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1e3a0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1e3b0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1e3c0 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1e3d0 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1e3e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1e3f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e400 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1e410 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1e420 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1e430 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72  Direct){.  PgHdr
1e440 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
1e450 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1e460 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e470 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK;..#ifndef S
1e480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1e490 4d 49 43 5f 57 52 49 54 45 0a 20 20 61 73 73 65  MIC_WRITE.  asse
1e4a0 72 74 28 20 69 73 44 69 72 65 63 74 3d 3d 30 20  rt( isDirect==0 
1e4b0 29 3b 20 20 2f 2a 20 69 73 44 69 72 65 63 74 20  );  /* isDirect 
1e4c0 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
1e4d0 20 61 74 6f 6d 69 63 20 77 72 69 74 65 73 20 2a   atomic writes *
1e4e0 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  /.#endif.  if( !
1e4f0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1e500 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f  untDone ){.    /
1e510 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
1e520 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
1e530 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
1e540 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1e550 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1e560 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
1e570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e580 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
1e590 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b  if( !isDirect ){
1e5a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e5b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e5c0 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  gHdr);.      if(
1e5d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e5e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e5f0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1e600 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  dr);.        ret
1e610 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e620 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
1e630 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1e640 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1e650 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1e660 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1e670 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1e680 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1e690 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
1e6a0 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
1e6b0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
1e6c0 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
1e6d0 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
1e6e0 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e6f0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66  e_counter);..#if
1e700 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e710 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
1e720 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20     if( isDirect 
1e730 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
1e740 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1e750 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
1e760 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74  f = pPgHdr->pDat
1e770 61 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  a;.      rc = sq
1e780 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1e790 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
1e7a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1e7b0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
1e7c0 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  f..    /* Releas
1e7d0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1e7e0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
1e7f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e800 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
1e810 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1e820 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
1e830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e840 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
1e850 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a  r file to disk..
1e860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1e870 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
1e880 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e890 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
1e8a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1e8b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1e8c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e8d0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1e8e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1e8f0 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
1e900 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e910 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1e920 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
1e930 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
1e940 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
1e950 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
1e960 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1e970 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1e980 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1e990 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
1e9a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1e9b0 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
1e9c0 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
1e9d0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
1e9e0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1e9f0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
1ea00 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1ea10 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
1ea20 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
1ea30 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1ea40 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
1ea50 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
1ea60 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
1ea70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
1ea80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ea90 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
1eaa0 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
1eab0 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
1eac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ead0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1eae0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1eaf0 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
1eb00 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
1eb10 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
1eb20 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
1eb30 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
1eb40 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
1eb50 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
1eb60 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
1eb70 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
1eb80 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1eb90 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
1eba0 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63  parameter nTrunc
1ebb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ebc0 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
1ebd0 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
1ebe0 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65  o.** nTrunc page
1ebf0 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20  s (this is used 
1ec00 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
1ec10 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a  atabases)..**.**
1ec20 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
1ec30 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
1ec40 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
1ec50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec60 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
1ec70 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
1ec80 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
1ec90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1eca0 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
1ecb0 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
1ecc0 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
1ecd0 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
1ece0 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
1ecf0 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
1ed00 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
1ed10 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
1ed20 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1ed30 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
1ed40 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e   *pPager, .  con
1ed50 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1ed60 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  , .  Pgno nTrunc
1ed70 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29  ,.  int noSync.)
1ed80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ed90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
1eda0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1edb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
1edc0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1edd0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68  }..  /* If no ch
1ede0 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
1edf0 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61  made, we can lea
1ee00 76 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ve the transacti
1ee10 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20  on early..  */. 
1ee20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
1ee30 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20  odified==0 &&.  
1ee40 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a        (pPager->j
1ee50 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1ee60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
1ee70 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20  LETE ||.        
1ee80 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
1ee90 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20  iveMode!=0) ){. 
1eea0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1eeb0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
1eec0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1eed0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
1eee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eef0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
1ef00 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1ef10 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1ef20 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1ef30 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1ef40 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1ef50 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1ef60 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1ef70 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1ef80 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1ef90 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1efa0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1efb0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1efc0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1efd0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1efe0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1eff0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1f000 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1f010 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1f020 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1f030 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1f040 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f050 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1f060 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  TE.    /* The at
1f070 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
1f080 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
1f090 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  sed if all of th
1f0a0 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
1f0b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
1f0c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
1f0d0 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
1f0e0 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
1f0f0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
1f100 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20  ty for.    **   
1f110 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
1f120 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
1f130 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69  .    **    + Thi
1f140 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
1f150 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
1f160 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
1f170 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
1f180 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  + Exactly one pa
1f190 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
1f1a0 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
1f1b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1f1c0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1f1d0 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
1f1e0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
1f1f0 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  d, then the jour
1f200 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
1f210 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72  ver.    ** be cr
1f220 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
1f230 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1f240 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  */.    int useAt
1f250 6f 6d 69 63 57 72 69 74 65 3b 0a 20 20 20 20 70  omicWrite;.    p
1f260 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
1f270 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f280 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f290 20 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65    useAtomicWrite
1f2a0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d   = (.        !zM
1f2b0 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20  aster && .      
1f2c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f2d0 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20  lOpen &&.       
1f2e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f2f0 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
1f300 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
1f310 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d          nTrunc==
1f320 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70  0 && .        (p
1f330 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44  Pg==0 || pPg->pD
1f340 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a  irty==0).    );.
1f350 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1f360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1f370 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1f380 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1f390 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
1f3a0 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d  .    if( useAtom
1f3b0 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  icWrite ){.     
1f3c0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e   /* Update the n
1f3d0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
1f3e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1f3f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73  /.      int offs
1f400 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
1f410 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
1f420 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
1f430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1f440 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a  ager->nRec==1);.
1f450 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1f460 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1f470 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67  fd, offset, pPag
1f480 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
1f490 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1f4a0 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
1f4b0 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c  ounter. The foll
1f4c0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
1f4d0 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20  modify.      ** 
1f4e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
1f4f0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1f500 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64  page 1 to includ
1f510 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20  e the updated.  
1f520 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f      ** change co
1f530 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
1f540 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65  rite page 1 dire
1f550 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
1f560 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
1f570 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
1f580 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
1f590 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
1f5a0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
1f5b0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  , .      ** this
1f5c0 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
1f5d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
1f5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f600 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1f610 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
1f620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1f630 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1f640 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
1f650 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
1f660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f670 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20  !useAtomicWrite 
1f680 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f690 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   ).#endif..    /
1f6a0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1f6b0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1f6c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f6d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1f6e0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1f6f0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1f700 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1f710 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1f720 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1f730 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1f740 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1f750 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1f760 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1f770 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1f780 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1f790 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1f7a0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1f7b0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1f7c0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1f7d0 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1f7e0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f7f0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1f800 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1f810 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1f820 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1f830 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1f840 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
1f850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f860 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f870 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  t;.      if( pPa
1f880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f890 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1f8a0 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64  ODE_OFF ){.#ifnd
1f8b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f8c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1f8d0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1f8e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1f8f0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1f900 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1f910 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1f920 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1f930 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  s.          ** b
1f940 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1f950 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1f960 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1f970 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1f980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c            ** fil
1f990 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1f9a0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1f9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1f9c0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
1f9d0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
1f9e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d           for( i=
1f9f0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1fa00 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1fa10 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1fa20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1fa30 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1fa40 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
1fa50 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1fa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1fa70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fa80 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
1fa90 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1faa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fab0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1fac0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1fad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fae0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1faf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1fb00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fb10 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1fb20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fb30 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1fb40 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1fb50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fb60 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 7d 0a     } .        }.
1fb70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
1fb80 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1fb90 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1fba0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
1fbb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fbc0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1fbd0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  xit;.        rc 
1fbe0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1fbf0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
1fc00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1fc10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fc20 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69  o sync_exit;..#i
1fc30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fc40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1fc50 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1fc60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fc70 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1fc80 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1fc90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fcb0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fcc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1fcd0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1fce0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1fcf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1fd00 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1fd10 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1fd20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1fd30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1fd40 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1fd50 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1fd60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fd70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1fd80 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
1fd90 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
1fda0 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
1fdb0 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
1fdc0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
1fdd0 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
1fde0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
1fdf0 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
1fe00 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
1fe10 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
1fe20 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
1fe30 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
1fe40 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1fe50 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
1fe60 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
1fe70 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
1fe80 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
1fe90 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
1fea0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
1feb0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1fec0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
1fed0 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
1fee0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
1fef0 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
1ff00 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
1ff10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ff20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1ff30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ff40 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
1ff50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1ff60 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1ff70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ff80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1ff90 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
1ffa0 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
1ffb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1ffc0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1ffd0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1ffe0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
1fff0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
20000 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
20010 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20020 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
20030 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
20040 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
20050 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
20060 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
20070 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
20080 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
20090 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
200a0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
200b0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
200c0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
200d0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
200e0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
200f0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
20100 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
20110 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
20120 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
20130 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
20140 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
20150 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
20160 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
20170 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
20180 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
20190 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
201a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
201b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
201c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
201d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
201e0 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
201f0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
20200 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
20210 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
20220 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
20230 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
20240 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
20250 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
20260 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
20270 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
20280 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
20290 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
202a0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
202b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
202c0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
202d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
202e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
202f0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
20300 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
20310 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
20320 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20330 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20340 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
20350 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
20360 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
20370 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
20380 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
20390 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
203a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
203b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
203c0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
203d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
203e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
203f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20400 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20410 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
20420 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
20430 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
20440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50  LITE_OK;.  }.  P
20450 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
20460 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
20470 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73  D(pPager));.  as
20480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20490 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
204a0 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
204b0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
204c0 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  e );.  rc = page
204d0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
204e0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
204f0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
20500 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
20510 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
20520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20530 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
20540 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
20550 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
20560 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
20570 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
20580 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
20590 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
205a0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
205b0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
205c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
205d0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
205e0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
205f0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
20600 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
20610 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
20620 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
20630 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
20640 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
20650 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
20660 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
20670 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
20680 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
20690 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
206a0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
206b0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
206c0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
206d0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
206e0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
206f0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
20700 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
20710 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
20720 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20730 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
20740 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20750 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
20760 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45  QLITE_OK;.  PAGE
20780 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
20790 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
207a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
207b0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
207c0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
207d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
207e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
207f0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
20800 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
20810 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
20820 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
20830 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
20840 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
20850 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
20860 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20870 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
20880 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
20890 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
208a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
208b0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
208c0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
208d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
208e0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
208f0 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
20900 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
20910 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
20920 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20930 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
20940 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
20950 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
20960 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
20970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
20990 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
209a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
209b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
209c0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
209d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
209e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
209f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20a00 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
20a10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20a20 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
20a30 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
20a40 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
20a50 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
20a60 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
20a70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
20a80 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
20a90 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
20aa0 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
20ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
20ac0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
20ad0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
20ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20af0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
20b00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20b10 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
20b20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
20b30 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
20b40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
20b50 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
20b60 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
20b70 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
20b80 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
20b90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
20ba0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
20bb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20bc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
20bd0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
20be0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
20bf0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
20c00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20c10 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20c20 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
20c30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20c50 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
20c60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20c70 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
20c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20c90 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
20ca0 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
20cb0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
20cc0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
20cd0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
20ce0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
20cf0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
20d00 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
20d10 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
20d20 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
20d30 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
20d40 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
20d50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
20d60 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
20d70 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
20d80 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
20d90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
20da0 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
20db0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
20dc0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
20dd0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
20de0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
20df0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20e00 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
20e10 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
20e20 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
20e30 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
20e40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
20e50 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
20e60 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
20e70 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
20e80 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
20e90 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
20ea0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
20eb0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
20ec0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
20ed0 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
20ee0 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn a;.}.int sql
20ef0 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
20f00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20f10 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
20f20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20f30 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
20f40 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
20f50 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
20f60 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
20f70 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
20f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
20f90 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
20fa0 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
20fb0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
20fc0 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
20fd0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
20fe0 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
20ff0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
21000 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
21010 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
21020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21030 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65 67  int pagerStmtBeg
21040 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
21050 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
21060 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
21070 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
21080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21090 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
210a0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
210b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
210c0 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
210d0 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
210e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
210f0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 21 70  ager));.  if( !p
21100 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21110 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
21120 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
21130 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
21140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21150 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21160 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
21170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21180 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  >pInStmt==0 );. 
21190 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
211a0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
211b0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
211c0 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
211d0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30  ager->pInStmt==0
211e0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
211f0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21200 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
21210 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
21220 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21230 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21240 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
21250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
21260 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21270 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21280 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
21290 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
212a0 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
212b0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
212c0 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
212d0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
212e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
212f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
21300 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
21310 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
21320 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
21330 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 74 66  Open(pPager->stf
21340 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
21350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21360 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
21370 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
21380 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  tfd, SQLITE_OPEN
21390 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
213a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
213b0 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f        goto stmt_
213c0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
213d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
213e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
213f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
21400 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21410 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21420 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
21430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21440 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
21450 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
21460 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20  er->pInStmt ){. 
21470 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
21480 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
21490 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  pInStmt);.    pP
214a0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
214b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
214c0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
214d0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
214e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
214f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
21500 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
21510 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
21520 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21530 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
21540 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
21550 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
21560 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21570 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
21580 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21590 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
215a0 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  T-COMMIT %d\n", 
215b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
215c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ;.    sqlite3Bit
215d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
215e0 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
215f0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
21600 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21610 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21620 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21630 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 69  InUse = 0;.    i
21640 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
21650 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73  ournal(pPager->s
21660 74 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71  tfd) ){.      sq
21670 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
21680 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
21690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
216a0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
216b0 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
216c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
216d0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
216e0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
216f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
21700 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
21710 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21720 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
21730 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21740 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
21750 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
21760 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21770 61 67 65 72 29 29 3b 0a 20 20 20 20 72 63 20 3d  ager));.    rc =
21780 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
21790 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
217a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
217b0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
217c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
217d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
217e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
217f0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
21800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21820 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21840 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21850 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
21860 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
21870 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21880 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
21890 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
218a0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
218b0 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
218c0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
218d0 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
218e0 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
218f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21900 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
21910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21920 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
21930 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
21940 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
21950 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
21960 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
21970 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
21980 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
21990 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
219a0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
219b0 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
219c0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
219d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
219e0 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
219f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21a00 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
21a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21a20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21a30 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
21a40 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
21a50 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
21a60 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
21a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21a80 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
21a90 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
21aa0 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
21ab0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21ac0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
21ad0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21ae0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21af0 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
21b00 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
21b10 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
21b20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
21b30 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
21b40 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
21b50 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
21b60 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
21b70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21b80 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
21b90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21ba0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
21bb0 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
21bc0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
21bd0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
21be0 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
21bf0 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
21c00 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
21c10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
21c20 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
21c30 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
21c40 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
21c50 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
21c60 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
21c70 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
21c80 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
21c90 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
21ca0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
21cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21cc0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
21cd0 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
21ce0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
21cf0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
21d00 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
21d10 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21d20 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
21d30 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
21d40 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
21d50 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
21d60 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
21d70 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
21d80 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
21d90 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
21da0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
21db0 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
21dc0 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
21dd0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
21de0 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
21df0 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
21e00 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
21e10 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
21e20 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
21e30 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
21e40 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
21e50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21e60 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
21e70 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
21e80 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
21e90 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
21ea0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
21eb0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
21ec0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
21ed0 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
21ee0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
21ef0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
21f00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
21f10 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
21f20 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
21f30 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
21f40 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
21f50 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
21f60 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
21f70 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
21f80 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
21f90 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
21fa0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
21fb0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
21fc0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
21fd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
21fe0 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
21ff0 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
22000 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
22010 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
22020 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
22030 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
22040 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
22050 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
22060 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
22070 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
22080 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
22090 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
220a0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
220b0 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
220c0 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
220d0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
220e0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
220f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
22100 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22110 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
22120 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
22130 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
22140 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
22150 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
22160 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
22170 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
22180 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
22190 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
221a0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
221b0 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
221c0 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
221d0 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
221e0 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
221f0 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
22200 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22210 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
22220 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
22230 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a  NC)?1:0, pgno);.
22240 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
22250 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
22260 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
22270 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
22280 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
22290 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
222a0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
222b0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
222c0 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
222d0 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
222e0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
222f0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
22300 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
22310 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
22320 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
22330 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
22340 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
22350 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
22360 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
22370 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
22380 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
22390 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
223a0 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
223b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
223c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
223d0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
223e0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
223f0 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
22400 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
22410 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
22420 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
22430 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
22440 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
22450 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
22460 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55  ags&PGHDR_IN_JOU
22470 52 4e 41 4c 29 20 7c 7c 20 28 69 6e 74 29 70 67  RNAL) || (int)pg
22480 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
22490 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
224a0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
224b0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
224c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
224d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
224e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
224f0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
22500 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
22510 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
22520 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
22530 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
22540 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
22550 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
22560 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
22570 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
22580 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
22590 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
225a0 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
225b0 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
225c0 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
225d0 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
225e0 26 3d 20 7e 28 50 47 48 44 52 5f 4e 45 45 44 5f  &= ~(PGHDR_NEED_
225f0 53 59 4e 43 7c 50 47 48 44 52 5f 49 4e 5f 4a 4f  SYNC|PGHDR_IN_JO
22600 55 52 4e 41 4c 29 3b 0a 20 20 70 50 67 4f 6c 64  URNAL);.  pPgOld
22610 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
22620 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
22630 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
22640 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
22650 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
22660 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
22670 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
22680 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
22690 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 20 20  ED_SYNC);.  }.  
226a0 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76 65  if( sqlite3Bitve
226b0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
226c0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 20  nJournal, pgno) 
226d0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
226e0 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  s |= PGHDR_IN_JO
226f0 55 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 73 71  URNAL;.  }..  sq
22700 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
22710 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg, pgno);.  if
22720 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
22730 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
22740 65 28 70 50 67 4f 6c 64 2c 20 30 29 3b 0a 20 20  e(pPgOld, 0);.  
22750 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
22760 65 6c 65 61 73 65 28 70 50 67 4f 6c 64 29 3b 0a  elease(pPgOld);.
22770 20 20 7d 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79    }..  makeDirty
22780 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
22790 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
227a0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
227b0 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
227c0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
227d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
227e0 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
227f0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
22800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
22810 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
22820 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
22830 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
22840 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
22850 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
22860 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
22870 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
22880 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
22890 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
228a0 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
228b0 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
228c0 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
228d0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
228e0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
228f0 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
22900 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
22910 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
22920 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
22930 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
22940 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
22950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
22960 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
22970 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
22980 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
22990 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
229a0 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
229b0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
229c0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
229d0 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
229e0 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
229f0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
22a00 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
22a10 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
22a20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
22a30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
22a40 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
22a50 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
22a60 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
22a70 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
22a80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
22a90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
22aa0 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
22ab0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
22ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
22ad0 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
22ae0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
22af0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
22b00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
22b10 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
22b20 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
22b30 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
22b40 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
22b50 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
22b60 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
22b70 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
22b80 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
22b90 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
22ba0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
22bb0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
22bc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
22bd0 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
22be0 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
22bf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
22c10 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
22c20 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65  rnal && (int)nee
22c30 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
22c40 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
22c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22c60 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
22c70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
22c80 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20  needSyncPgno);. 
22c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
22ca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22cb0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
22cc0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  nc = 1;.    asse
22cd0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  rt( pPager->noSy
22ce0 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  nc==0 && !MEMDB 
22cf0 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  );.    pPgHdr->f
22d00 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
22d10 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 70 50 67  ED_SYNC;.    pPg
22d20 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
22d30 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  HDR_IN_JOURNAL;.
22d40 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
22d50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
22d60 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
22d70 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Hdr);.  }..  ret
22d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22d90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
22da0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22db0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
22dc0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
22dd0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
22de0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
22df0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22e00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
22e10 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
22e20 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
22e30 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
22e40 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
22e50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22e60 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
22e70 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
22e80 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
22e90 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
22ea0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
22eb0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
22ec0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
22ed0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
22ee0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22ef0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
22f00 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
22f10 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b  ?pPg->pExtra:0);
22f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
22f30 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
22f40 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
22f50 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
22f60 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
22f70 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
22f80 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
22f90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22fa0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
22fb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22fc0 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
22fd0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
22fe0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
22ff0 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
23000 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
23010 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
23020 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
23030 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
23040 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
23050 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
23060 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
23070 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23080 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
23090 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
230a0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
230b0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
230c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
230d0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
230e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
230f0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
23100 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
23110 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
23120 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
23130 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
23140 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
23150 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
23160 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
23170 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
23190 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
231a0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
231b0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
231c0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
231d0 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
231e0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
231f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
23200 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
23210 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
23220 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
23230 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
23240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
23250 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
23260 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
23270 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
23280 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
23290 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
232a0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
232b0 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
232c0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
232d0 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20  LMODE_QUERY.**  
232e0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
232f0 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ODE_DELETE.**   
23300 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
23310 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  DE_TRUNCATE.**  
23320 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
23330 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20  ODE_PERSIST.**  
23340 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
23350 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66  ODE_OFF.**.** If
23360 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
23370 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
23380 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  en the journal-m
23390 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
233a0 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69  e.** value speci
233b0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
233c0 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74  returned indicat
233d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  e the current (p
233e0 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
233f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  .** journal-mode
23400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23410 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
23420 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23430 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66  int eMode){.  if
23440 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
23450 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
23460 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23470 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
23480 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
23490 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
234a0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
234b0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
234c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
234d0 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
234e0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
234f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23500 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
23510 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
23520 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
23530 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
23540 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
23550 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
23560 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
23570 20 20 20 20 61 73 73 65 72 74 28 20 50 41 47 45      assert( PAGE
23580 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
23590 45 52 59 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  ERY<0 );.    if(
235a0 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20   eMode>=0 ){.   
235b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
235c0 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  alMode = eMode;.
235d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
235e0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
235f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23600 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 20 20 7d  E_QUERY );.    }
23610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
23620 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
23630 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
23640 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a   Get/set the siz
23650 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72  e-limit used for
23660 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
23670 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36  nal files..*/.i6
23680 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
23690 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
236a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
236b0 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
236c0 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
236d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
236e0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
236f0 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
23700 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
23710 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
23720 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23730 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.