/ Hex Artifact Content
Login

Artifact 032d11049af4ec49bdbaa3584e7ce9887098b66a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 38  : pager.c,v 1.48
0350: 35 20 32 30 30 38 2f 30 38 2f 32 38 20 30 32 3a  5 2008/08/28 02:
0360: 32 36 3a 30 37 20 64 72 68 20 45 78 70 20 24 0a  26:07 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
03f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0400: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0410: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0430: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0440: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0450: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0460: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
0470: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0480: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
0490: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04a0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04b0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04c0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
04d0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
04e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04f0: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0500: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0510: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0520: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0530: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0540: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0550: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0560: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
0590: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05a0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05c0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
05d0: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
05e0: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
05f0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0600: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0610: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0620: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0630: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0640: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0650: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0660: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
0670: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
0680: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
0690: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06a0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06b0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06c0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
06d0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06e0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
06f0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0700: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0710: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0720: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0730: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0740: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0750: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0760: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0770: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0780: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0790: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07a0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07b0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07e0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
07f0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0810: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0820: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0830: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0860: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0870: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0880: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0890: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08c0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08d0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0900: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0910: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0920: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0930: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0940: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0960: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0970: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0980: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
0990: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09b0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09c0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09d0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09e0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a10: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a20: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a30: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a70: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a90: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0aa0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ab0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ac0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0ae0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0af0: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b00: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b10: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b40: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b50: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b60: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b70: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0b90: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0ba0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bb0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0be0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0bf0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c00: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c10: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c20: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c30: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c50: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c60: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c70: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0ca0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cb0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0ce0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0cf0: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d00: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0d70: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0d80: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0d90: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0da0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0db0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0dc0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0dd0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0de0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0df0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e00: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e10: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e20: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e30: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e40: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e50: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e60: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0e70: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0e80: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0e90: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ea0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0eb0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ec0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ed0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0ee0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ef0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f00: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f10: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f20: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f30: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f40: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f50: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f60: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0f70: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0f80: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0f90: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fa0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fb0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0fc0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
0fd0: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
0fe0: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
0ff0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1000: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1020: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1030: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1040: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1050: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1060: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
1070: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
1080: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
1090: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10a0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10b0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10c0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
10d0: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
10e0: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
10f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1100: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1110: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1120: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1130: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1140: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1150: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1160: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
1170: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
1180: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
1190: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11a0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11c0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
11d0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
11e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
11f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1200: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1210: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1220: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1230: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1240: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1250: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1260: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1270: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
1280: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
1290: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12a0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12b0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12c0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
12d0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12e0: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
12f0: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1300: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1310: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1320: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1330: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1340: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1350: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1360: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1370: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1380: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
1390: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13a0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13b0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13c0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
13d0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13e0: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
13f0: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1400: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1410: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1420: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1430: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1440: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1450: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1460: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
1470: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
1480: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
1490: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14a0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14b0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
14d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
14e0: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
14f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1510: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1520: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1530: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1540: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1550: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1560: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
1570: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
1580: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
1590: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15a0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15b0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15c0: 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  )&~7)../*.** A m
15d0: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
15e0: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
15f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1600: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1610: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1620: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1630: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1640: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1650: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1660: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
1670: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
1680: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
1690: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
16a0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
16b0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
16d0: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
16e0: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
16f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1700: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1710: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1720: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1730: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1740: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1750: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
1760: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
1770: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
1780: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
1790: 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51  UPT, or.** or SQ
17a0: 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20  LITE_FULL. Once 
17b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  one of the first
17c0: 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63   three errors oc
17d0: 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74  curs, it persist
17e0: 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75  s.** and is retu
17f0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
1800: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
1810: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
1820: 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
1830: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
1840: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
1850: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
1860: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
1870: 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63  the.** next succ
1880: 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20  essful rollback 
1890: 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  is performed on 
18a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
18b0: 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45   Also,.** SQLITE
18c0: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
18d0: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
18e0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
18f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1900: 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68  up().** APIs, th
1910: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
1920: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
1930: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  y..*/.struct Pag
1940: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
1950: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
1960: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
1970: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
1980: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1990: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
19a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
19b0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19c0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
19d0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
19e0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
19f0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
1a00: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
1a10: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
1a20: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
1a40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a50: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
1a60: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
1a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a80: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1a90: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
1aa0: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
1ab0: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
1ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ad0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1ae0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
1af0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
1b00: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
1b10: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
1b20: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
1b30: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
1b50: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
1b60: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
1b70: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
1b80: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
1b90: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
1bc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
1bd0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
1be0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
1bf0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
1c00: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
1c10: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
1c20: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
1c30: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
1c40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1c50: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
1c60: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
1c70: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
1c90: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
1ca0: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
1cb0: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
1cc0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
1cd0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1ce0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
1cf0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
1d00: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d20: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
1d30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
1d40: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d60: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
1d70: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
1d80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1d90: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1db0: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
1dc0: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
1dd0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1de0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1df0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
1e00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
1e10: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
1e20: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
1e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e40: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
1e50: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
1e60: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
1e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e80: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
1e90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1ea0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
1eb0: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1ed0: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
1ee0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
1ef0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
1f00: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1f20: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
1f40: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
1f50: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
1f60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
1f70: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
1f80: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
1f90: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
1fa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1fb0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
1fc0: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
1fd0: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
1fe0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
1ff0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
2000: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
2010: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
2020: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
2030: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
2040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2050: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
2060: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2070: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2090: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
20a0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
20b0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20e0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
20f0: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2110: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2120: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2130: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2140: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2150: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2160: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2170: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2180: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21b0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
21c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
21d0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
21e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21f0: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2200: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2210: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2220: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2240: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2250: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2260: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2270: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2280: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2290: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
22a0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
22b0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
22c0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
22d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
22f0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2300: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2310: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2320: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2330: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2340: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2350: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2360: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2370: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2380: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
2390: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
23a0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
23b0: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
23c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
23e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
23f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2420: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
2430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2440: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2450: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2460: 61 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65  abase */.  Bitve
2470: 63 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  c *pAlwaysRollba
2480: 63 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69  ck;    /* One bi
2490: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
24a0: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f  marked always-ro
24b0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72  llback */.  char
24c0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24f0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2500: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2510: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2540: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2550: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2560: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2570: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2580: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2590: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
25a0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
25b0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
25c0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
25d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25e0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *stfd;         /
25f0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2600: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
2610: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
2620: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2630: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2640: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2650: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2660: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2670: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2680: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2690: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
26a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
26e0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
26f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
2700: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
2710: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2720: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2730: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
2740: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
2750: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
2760: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
2770: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
2780: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
2790: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
27a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
27c0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
27d0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
27e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
27f0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
2800: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
2810: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
2820: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2830: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
2840: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
2850: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
2860: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
2870: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
2880: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
2890: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
28a0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
28b0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
28c0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
28d0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
28e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
28f0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2900: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2910: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
2920: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
2930: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2940: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
2950: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2960: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
2970: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
2980: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
2990: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
29a0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
29b0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
29c0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
29d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
29e0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
29f0: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
2a00: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a20: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
2a30: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2a40: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
2a50: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
2a60: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
2a70: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
2a80: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2a90: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
2aa0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
2ab0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
2ac0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
2ad0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
2ae0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
2af0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2b00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
2b10: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
2b20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
2b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
2b40: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
2b50: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
2b60: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
2b70: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
2b80: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
2b90: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
2ba0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
2bb0: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
2bc0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
2bd0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
2be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2bf0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
2c00: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2c10: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
2c20: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
2c30: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
2c40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2c50: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2c60: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
2c70: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
2c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
2c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2ca0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
2cb0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
2cc0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2ce0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
2cf0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
2d00: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
2d10: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
2d20: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
2d30: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2d40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2d50: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2d60: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2d70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2d80: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2d90: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2da0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2db0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2dc0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2dd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2de0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
2df0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
2e00: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
2e10: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2e20: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
2e30: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
2e40: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
2e50: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
2e60: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
2e70: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
2e80: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
2e90: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2ea0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
2eb0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
2ec0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
2ed0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
2ee0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
2ef0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
2f00: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
2f10: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2f20: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
2f30: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
2f40: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
2f50: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
2f60: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
2f70: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
2f80: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
2f90: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
2fa0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2fb0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
2fc0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
2fd0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
2fe0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
2ff0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3000: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3010: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3020: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3030: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3040: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3050: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3060: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3070: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3080: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3090: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
30a0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
30b0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
30c0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
30d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
30e0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
30f0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3100: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3110: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3120: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3130: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3140: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3150: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3160: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3170: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3180: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3190: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
31a0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
31b0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
31c0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
31d0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
31e0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
31f0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3200: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3210: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3220: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3230: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3240: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3250: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3260: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3270: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3280: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3290: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
32a0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
32b0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
32c0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
32d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
32e0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
32f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3300: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3310: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3320: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3330: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3350: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3360: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3370: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3380: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3390: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
33a0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
33b0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
33c0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
33d0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
33e0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
33f0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3400: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
34a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
34b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
34c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
34d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
34e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
34f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
35a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
35b0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
35c0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
35d0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
35e0: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
35f0: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
3600: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
3610: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
3620: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
3630: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
3640: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3650: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
3660: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3680: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
3690: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
36a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
36b0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
36c0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
36d0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
36e0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
36f0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
3700: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
3710: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
3720: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
3730: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
3740: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
3750: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
3760: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3770: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
3780: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3790: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
37a0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
37b0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
37c0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
37d0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
37e0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
37f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3800: 65 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68  e if page *pPg h
3810: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
3820: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
3830: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72  tatement.** jour
3840: 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  nal (or statemen
3850: 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62  t snapshot has b
3860: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20  een created, if 
3870: 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20  *pPg is part.** 
3880: 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  of an in-memory 
3890: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
38a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53  atic int pageInS
38b0: 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a  tatement(PgHdr *
38c0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
38d0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
38e0: 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  ger;.  if( MEMDB
38f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3900: 50 67 2d 3e 61 70 53 61 76 65 5b 31 5d 21 3d 30  Pg->apSave[1]!=0
3910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3920: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
3930: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
3940: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
3950: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
3960: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3970: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3980: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3990: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
39a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
39b0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
39c0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39d0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39e0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
3a00: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
3a10: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3a20: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a30: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a40: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a60: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
3a70: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
3a80: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
3a90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3aa0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
3ab0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
3ac0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
3ad0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
3ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3af0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
3b00: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
3b10: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
3b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
3b30: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
3b40: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
3b50: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
3b60: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
3b70: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
3b80: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
3b90: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
3ba0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
3bb0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3bc0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
3bd0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3be0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
3bf0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
3c00: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
3c10: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
3c20: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c40: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
3c50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
3c60: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
3c70: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
3c80: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
3c90: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
3ca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
3cb0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
3cc0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
3cd0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
3ce0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
3cf0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
3d00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
3d10: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
3d20: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
3d30: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
3d40: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
3d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d60: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
3d70: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3d80: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
3d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3da0: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
3db0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3dc0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
3dd0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
3de0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
3df0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
3e00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
3e10: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
3e20: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
3e30: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3e40: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
3e50: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
3e60: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
3e70: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3e80: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
3e90: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
3ea0: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
3eb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
3ec0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
3ed0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
3ee0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
3ef0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
3f00: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
3f10: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
3f20: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
3f30: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
3f40: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
3f50: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3f60: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
3f70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3f80: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
3f90: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
3fa0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
3fb0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
3fc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3fd0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
3ff0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
4000: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
4010: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
4020: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
4030: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
4040: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
4050: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
4060: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
4070: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
4080: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
4090: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
40a0: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
40b0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
40c0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
40d0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
40e0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
40f0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
4100: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
4110: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
4120: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
4130: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
4140: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
4150: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
4160: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
4170: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
4180: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
4190: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
41a0: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
41b0: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
41c0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
41d0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
41e0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
41f0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
4200: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4210: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
4220: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
4230: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4240: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
4250: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4260: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4270: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4280: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4290: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
42a0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
42b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
42c0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
42d0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
42e0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
42f0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4300: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4310: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4320: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4330: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4340: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4350: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4360: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4370: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4380: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4390: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
43a0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
43b0: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
43c0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
43d0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
43e0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
43f0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
4400: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4410: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
4420: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
4430: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
4440: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
4450: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
4460: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
4470: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
4480: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4490: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
44a0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
44b0: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
44c0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
44d0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
44e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
44f0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
4500: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
4510: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
4520: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
4530: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
4540: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
4550: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
4560: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
4570: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
4580: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4590: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
45a0: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
45b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
45c0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
45d0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
45e0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
45f0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
4600: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4610: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4620: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
4630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4640: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
4650: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
4660: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
4670: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
4680: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4690: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
46a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
46b0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
46c0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
46d0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
46e0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
46f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
4700: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
4710: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
4720: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
4730: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
4740: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
4750: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
4760: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
4770: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
4780: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
4790: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
47a0: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
47b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
47c0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
47d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
47e0: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
47f0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
4800: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
4810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4830: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
4840: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
4850: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
4860: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4870: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
4880: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
4890: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
48a0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
48b0: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
48c0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
48d0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
48e0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
48f0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
4900: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
4910: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
4920: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4930: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
4940: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
4950: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
4960: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4970: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4980: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
4990: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
49a0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
49b0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
49c0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
49d0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
49e0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
49f0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
4a00: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
4a10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
4a20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
4a30: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
4a40: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
4a50: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
4a60: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4a70: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
4a80: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
4a90: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
4aa0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
4ab0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
4ac0: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
4ad0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
4ae0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
4af0: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
4b00: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
4b10: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
4b20: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
4b30: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
4b40: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
4b50: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
4b60: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
4b70: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
4b80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
4b90: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
4ba0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
4bb0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
4bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
4bd0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4be0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
4bf0: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
4c00: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
4c10: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 0a  rCode || MEMDB .
4c20: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
4c30: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
4c40: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
4c50: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4c60: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4c70: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
4c80: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
4c90: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
4ca0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
4cb0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4cc0: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
4cd0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4ce0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
4cf0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
4d00: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
4d10: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
4d20: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
4d30: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
4d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
4d50: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
4d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
4d70: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
4d80: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
4d90: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
4da0: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
4db0: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
4dc0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
4dd0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
4de0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
4df0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
4e00: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
4e10: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
4e20: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
4e30: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
4e40: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
4e50: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
4e60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
4e70: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
4e80: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
4e90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
4ea0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
4eb0: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
4ec0: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
4ed0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
4ee0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
4ef0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
4f00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
4f10: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
4f20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
4f30: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4f40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4f50: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
4f60: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
4f70: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
4f80: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4fa0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
4fb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4fc0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
4fd0: 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72  ter, int nMaster
4fe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
4ff0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5000: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5010: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5030: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5040: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5050: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5060: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5070: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5080: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5090: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
50a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
50b0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
50c0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
50d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
50e0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
50f0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5100: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
5110: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
5120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5140: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5150: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5160: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5170: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5180: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5190: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
51a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
51b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
51c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
51d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
51e0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
51f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5200: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5220: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5240: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5250: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5260: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5280: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5290: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
52a0: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
52b0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
52c0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
52d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
52e0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
52f0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
5300: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
5310: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
5320: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5330: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5340: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5350: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5360: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5370: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5380: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5390: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
53a0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
53b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
53c0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
53d0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
53e0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
53f0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5400: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5410: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5420: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5430: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5440: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5460: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5470: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5480: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5490: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
54a0: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
54b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
54c0: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
54d0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
54e0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
54f0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5500: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5510: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5530: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5540: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5550: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5560: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5590: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
55b0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
55c0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
55d0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
55e0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
55f0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5600: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5610: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
5620: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
5630: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5640: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5650: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5660: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5670: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5680: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5690: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
56a0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
56b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
56c0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
56d0: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
56e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
56f0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5700: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5710: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5720: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5730: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5740: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5750: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
5760: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
5770: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
5780: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5790: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
57a0: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
57b0: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
57c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
57d0: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
57e0: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
57f0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5800: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
5810: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5820: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
5830: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5840: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
5850: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
5860: 48 64 72 5b 32 38 5d 3b 0a 0a 20 20 69 66 28 20  Hdr[28];..  if( 
5870: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5880: 66 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  ff ){.    i64 iL
5890: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
58a0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
58b0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
58c0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
58d0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
58e0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
58f0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
5900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5910: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
5920: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
5930: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5940: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
5950: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
5960: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
5970: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
5980: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5990: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
59a0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
59b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
59c0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
59d0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
59e0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
59f0: 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
5a00: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
5a10: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
5a20: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
5a30: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
5a40: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
5a50: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
5a60: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
5a70: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
5a80: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
5a90: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
5aa0: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
5ab0: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
5ac0: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
5ad0: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
5ae0: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
5af0: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
5b00: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
5b10: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
5b20: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
5b30: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
5b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
5b50: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
5b60: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
5b70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
5b80: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
5b90: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
5ba0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5bb0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
5bc0: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
5bd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5be0: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
5bf0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5c00: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
5c10: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
5c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
5c50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
5c60: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
5c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5c80: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
5c90: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
5ca0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
5cb0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
5cc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5cd0: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
5ce0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
5cf0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
5d00: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
5d10: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
5d20: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
5d30: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
5d40: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
5d50: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
5d60: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
5d70: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
5d80: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
5d90: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
5da0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
5db0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
5dc0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
5dd0: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
5de0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
5df0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
5e00: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
5e10: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
5e20: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
5e30: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
5e40: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
5e50: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
5e60: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5e70: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5e80: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
5e90: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5eb0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5ec0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
5ed0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5ee0: 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64  K;.  char *zHead
5ef0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
5f00: 70 53 70 61 63 65 3b 0a 20 20 69 6e 74 20 6e 48  pSpace;.  int nH
5f10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
5f20: 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  pageSize;.  int 
5f30: 6e 57 72 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e  nWrite;..  if( n
5f40: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
5f50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
5f60: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
5f70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5f80: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
5f90: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
5fa0: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
5fb0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
5fc0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
5fd0: 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73  nalOff;.  }..  s
5fe0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
5ff0: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
6000: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
6010: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6020: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  ;..  memcpy(zHea
6030: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
6040: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6050: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f  nalMagic));..  /
6060: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
6070: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
6080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
6090: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
60a0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
60b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
60c0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
60d0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
60e0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
60f0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
6100: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
6110: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
6120: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
6130: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
6140: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
6150: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
6160: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
6170: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
6180: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
6190: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
61a0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
61b0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
61c0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
61d0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
61e0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
61f0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
6200: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
6210: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
6220: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
6230: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
6240: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
6250: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
6260: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
6270: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
6280: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
6290: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
62a0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
62b0: 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
62c0: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
62d0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
62e0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
62f0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
6300: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
6310: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
6320: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
6330: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
6340: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
6350: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
6360: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
6370: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
6380: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
6390: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
63a0: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
63b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
63c0: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
63d0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
63e0: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
63f0: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
6400: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
6410: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
6420: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
6430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
6440: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70  .  */.  assert(p
6450: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
6460: 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53  ods||pPager->noS
6470: 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61  ync);.  if( (pPa
6480: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20  ger->noSync) .  
6490: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
64a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
64b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
64c0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
64d0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
64e0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
64f0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6500: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
6510: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
6520: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
6530: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6540: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6550: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
6560: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
6570: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
6580: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6590: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
65a0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
65b0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
65c0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
65d0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
65e0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
65f0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
6600: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6610: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
6620: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6630: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6640: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6650: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6660: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6670: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6680: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
6690: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
66a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
66b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
66c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
66d0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
66e0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  rSize);.  if( pP
66f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6700: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
6710: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
6720: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
6730: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6740: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
6750: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
6760: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e  e);.  }..  for(n
6770: 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c  Write=0; rc==SQL
6780: 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a  ITE_OK&&nWrite<J
6790: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
67a0: 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e  ager); nWrite+=n
67b0: 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54  Header){.    IOT
67c0: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
67d0: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
67e0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
67f0: 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29  alHdr, nHeader))
6800: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6810: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
6820: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e  >jfd, zHeader, n
6830: 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e  Header, pPager->
6840: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
6850: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6860: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
6870: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
6880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
68a0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
68b0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
68c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
68d0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
68e0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
68f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
6900: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
6910: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
6920: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
6930: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
6940: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
6950: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6960: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6970: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6980: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6990: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
69a0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
69b0: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
69c0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
69d0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
69e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
69f0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
6a00: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
6a10: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
6a20: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
6a30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
6a40: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
6a50: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6a60: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6a70: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6a80: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6a90: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6aa0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6ab0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6ac0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6ad0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6ae0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
6af0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
6b00: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
6b10: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
6b20: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
6b30: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
6b40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
6b50: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6b60: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6b70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6b80: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6b90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6ba0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6bb0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6bc0: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6bd0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6be0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6bf0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
6c00: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
6c10: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
6c20: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
6c30: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
6c40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
6c50: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69  jrnlOff;.  int i
6c60: 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65  PageSize;..  see
6c70: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6c80: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
6c90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
6ca0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6cb0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
6cc0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
6cd0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6ce0: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
6cf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6d00: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
6d10: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
6d20: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
6d30: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e  eof(aMagic), jrn
6d40: 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20  lOff);.  if( rc 
6d50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
6d60: 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66  rnlOff += sizeof
6d70: 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28  (aMagic);..  if(
6d80: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
6d90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6da0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
6db0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6dc0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6dd0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6de0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6df0: 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29   jrnlOff, pNRec)
6e00: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6e10: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6e20: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6e30: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
6e40: 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  4, &pPager->cksu
6e50: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
6e60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6e70: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6e80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6e90: 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65  nlOff+8, pDbSize
6ea0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6eb0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6ec0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6ed0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
6ee0: 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50 61  +16, (u32 *)&iPa
6ef0: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
6f00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
6f10: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d 35   && iPageSize>=5
6f20: 31 32 20 0a 20 20 20 26 26 20 69 50 61 67 65 53  12 .   && iPageS
6f30: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
6f40: 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26 26  PAGE_SIZE .   &&
6f50: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
6f60: 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20  iPageSize)==0 . 
6f70: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
6f80: 73 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a 65  size = iPageSize
6f90: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6fa0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
6fb0: 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61 67 65  ze(pPager, &page
6fc0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  size);.  }.  if(
6fd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6fe0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6ff0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7000: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
7010: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
7020: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
7030: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7040: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
7050: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
7060: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
7070: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
7080: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
7090: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
70a0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
70b0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
70c0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
70d0: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
70e0: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
70f0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
7100: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
7110: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
7120: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
7130: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7140: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7150: 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26 70  ff+12, (u32 *)&p
7160: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7170: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
7180: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
7190: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
71a0: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
71b0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
71c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
71d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
71e0: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
71f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7200: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
7210: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
7220: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
7230: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
7240: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
7250: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
7260: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
7270: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
7280: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
7290: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
72a0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
72b0: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
72c0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
72d0: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
72e0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
72f0: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
7300: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
7310: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
7320: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20  mat is:.**.** + 
7330: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
7340: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62  J_PGNO..** + N b
7350: 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20  ytes: length of 
7360: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7370: 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  ame..** + 4 byte
7380: 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  s: N.** + 4 byte
7390: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
73a0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
73b0: 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61  .** + 8 bytes: a
73c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
73d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
73e0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
73f0: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
7400: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
7410: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
7420: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7430: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
7440: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
7450: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
7460: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
7470: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
7480: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
7490: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
74a0: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
74b0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
74c0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
74d0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
74e0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
74f0: 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69  ; .  int i; .  i
7500: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36  64 jrnlOff;.  i6
7510: 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33  4 jrnlSize;.  u3
7520: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63  2 cksum = 0;.  c
7530: 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28  har zBuf[sizeof(
7540: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
7550: 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  *4];..  if( !zMa
7560: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
7570: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
7580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
7590: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
75a0: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
75b0: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
75c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
75d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
75e0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
75f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
7600: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
7610: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
7620: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
7630: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
7640: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7650: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
7660: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
7670: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
7680: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
7690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
76a0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
76b0: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
76c0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
76d0: 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72   ){.    seekJour
76e0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
76f0: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
7700: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7710: 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ff;.  pPager->jo
7720: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
7730: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
7740: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
7750: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
7760: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
7770: 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63  ager));.  if( rc
7780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7790: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
77a0: 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d  ff += 4;..  rc =
77b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
77c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
77d0: 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f  ster, len, jrnlO
77e0: 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ff);.  if( rc!=S
77f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7800: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
7810: 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32  += len;..  put32
7820: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7830: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7840: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7850: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7860: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7870: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7880: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7890: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
78a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
78b0: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
78c0: 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f  nalMagic), jrnlO
78d0: 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b  ff);.  jrnlOff +
78e0: 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  = 8+sizeof(aJour
78f0: 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61  nalMagic);.  pPa
7900: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
7910: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
7920: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
7930: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
7940: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
7950: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
7960: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
7970: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
7980: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
7990: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
79a0: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
79b0: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
79c0: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
79d0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
79e0: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
79f0: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
7a00: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
7a10: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
7a20: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
7a30: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
7a40: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
7a50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
7a60: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
7a70: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
7a80: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
7a90: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
7aa0: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
7ab0: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
7ac0: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
7ad0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
7ae0: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
7af0: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
7b00: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28  e..  */ .  if( (
7b10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20  rc==SQLITE_OK). 
7b20: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
7b30: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7b40: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
7b50: 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ize))==SQLITE_OK
7b60: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
7b70: 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  jrnlOff.  ){.   
7b80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7b90: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7ba0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  jfd, jrnlOff);. 
7bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7bd0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7be0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7bf0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7c00: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7c10: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7c20: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7c30: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7c40: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7c50: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7c60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7c70: 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69  PgHdr *p;.  sqli
7c80: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
7c90: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
7ca0: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
7cb0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7cc0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d  ** Clear the in-
7cd0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
7ce0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
7cf0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
7d00: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
7d10: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
7d20: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
7d30: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
7d40: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
7d50: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
7d60: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
7d70: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
7d80: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
7d90: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
7da0: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
7db0: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
7dc0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
7dd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7de0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7df0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
7e00: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
7e10: 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
7e20: 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
7e30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7e40: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
7e50: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
7e60: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
7e70: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
7e80: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
7e90: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
7ea0: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
7eb0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
7ec0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
7ed0: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
7ee0: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
7ef0: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
7f00: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
7f10: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
7f20: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
7f30: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
7f40: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
7f50: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
7f60: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
7f70: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
7f80: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
7f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7fa0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
7fb0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7fc0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
7fd0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
7fe0: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
7ff0: 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e     int rc = osUn
8000: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
8010: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
8020: 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72   if( rc ) pPager
8030: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
8040: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
8050: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Size = -1;.     
8060: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
8070: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
8080: 29 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61  )..      /* Alwa
8090: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
80a0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
80b0: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
80c0: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  base lock..     
80d0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
80e0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
80f0: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
8100: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
8110: 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  .      ** delete
8120: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
8130: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
8140: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
8150: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8160: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pen ){.        s
8170: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
8180: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8190: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
81a0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
81b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
81c0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
81d0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
81e0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
81f0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
8210: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8220: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8230: 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ack);.        pP
8240: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
8250: 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
8260: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
8270: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
8280: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
8290: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
82a0: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
82b0: 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64        ** trusted
82c0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
82d0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
82e0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
82f0: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nts of the.     
8300: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
8310: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
8320: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
8330: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
8340: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8350: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8360: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
8370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8380: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8390: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
83a0: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
83b0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
83c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
83d0: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
83e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
83f0: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
8400: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
8410: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
8420: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
8430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
8440: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
8450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8460: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8470: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
8480: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
8490: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Use = 0;.       
84a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
84b0: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
84c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
84d0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
84e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
84f0: 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
8500: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f         pPager->o
8510: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8530: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20    if( !MEMDB || 
8540: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8550: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8560: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8570: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
8580: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8590: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
85a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
85b0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
85c0: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
85d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
85e0: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
85f0: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
8600: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
8610: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
8620: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
8630: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
8640: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
8650: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
8660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
8670: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
8680: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
8690: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
86a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
86b0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
86c0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
86d0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
86e0: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
86f0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
8700: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
8710: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
8720: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
8730: 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  lock(p);.}../*.*
8740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
8750: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
8760: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
8770: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
8780: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
8790: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
87a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
87b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
87c0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
87d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
87e0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
87f0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
8800: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
8810: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
8820: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
8830: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
8840: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
8850: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
8860: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
8870: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
8880: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
8890: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
88a0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
88b0: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
88c0: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
88d0: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
88e0: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
88f0: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
8900: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
8910: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
8920: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
8930: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
8940: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
8950: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
8960: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
8970: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
8980: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
8990: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
89a0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
89b0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
89c0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
89d0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
89e0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
89f0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
8a00: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
8a10: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
8a20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
8a30: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
8a40: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
8a50: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
8a60: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
8a70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8a80: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
8a90: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
8aa0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
8ab0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
8ac0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
8ad0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8ae0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
8af0: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
8b00: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
8b10: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
8b20: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
8b30: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
8b40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
8b50: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
8b60: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
8b70: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
8b80: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
8b90: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
8ba0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
8bb0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
8bc0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
8bd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
8be0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
8bf0: 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20  SIST.    ){.    
8c00: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
8c10: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
8c20: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
8c30: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
8c40: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
8c50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8c60: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
8c70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
8c80: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
8c90: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8ca0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
8cb0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
8cc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8cd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8cf0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
8d00: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
8d10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
8d20: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
8d30: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
8d40: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
8d50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8d60: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8d70: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
8d80: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
8d90: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8da0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
8db0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
8dc0: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
8dd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
8de0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8df0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  0;.    sqlite3Pc
8e00: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
8e10: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 23  ger->pPCache);.#
8e20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
8e30: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c  CK_PAGES.    sql
8e40: 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
8e50: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
8e60: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
8e70: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
8e80: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
8e90: 53 65 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d  SetFlags(pPager-
8ea0: 3e 70 50 43 61 63 68 65 2c 0a 20 20 20 20 20 20  >pPCache,.      
8eb0: 20 7e 28 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52   ~(PGHDR_IN_JOUR
8ec0: 4e 41 4c 20 7c 20 50 47 48 44 52 5f 4e 45 45 44  NAL | PGHDR_NEED
8ed0: 5f 53 59 4e 43 29 2c 20 30 0a 20 20 20 20 29 3b  _SYNC), 0.    );
8ee0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
8ef0: 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
8f00: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
8f10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
8f20: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8f30: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
8f40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
8f50: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8f60: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
8f70: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
8f80: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
8f90: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
8fa0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
8fb0: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
8fc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
8fd0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
8fe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8ff0: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
9000: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
9010: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
9020: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
9030: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
9040: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9050: 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73 74   0;.  /* lruList
9060: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
9070: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61  Pager); */.  pPa
9080: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
9090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
90a0: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72  dified = 0;..  r
90b0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
90c0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
90d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
90e0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
90f0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
9100: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
9110: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
9120: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
9130: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
9140: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
9150: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
9160: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
9170: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
9180: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
9190: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
91a0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
91b0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
91c0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
91d0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
91e0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
91f0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
9200: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
9210: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
9220: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
9230: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
9240: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
9250: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
9260: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
9270: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
9280: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
9290: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
92a0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
92b0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
92c0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
92d0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
92e0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
92f0: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
9300: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9310: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
9320: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
9330: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
9340: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
9350: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
9360: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
9370: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
9380: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
9390: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
93a0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
93b0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
93c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
93d0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
93e0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
93f0: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
9400: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9410: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
9420: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
9430: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
9440: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
9450: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
9460: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
9470: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
9480: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
9490: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
94a0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
94b0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
94c0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
94d0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
94e0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
94f0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
9500: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
9510: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
9520: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
9530: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
9540: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
9550: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
9560: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
9570: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
9580: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
9590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
95a0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
95b0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
95c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
95d0: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
95e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
95f0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9610: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9620: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
9630: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
9640: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
9650: 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c  * The isMainJrnl
9660: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
9670: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   this is the mai
9680: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
9690: 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20  al and.** false 
96a0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
96b0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  t journal.  The 
96c0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
96d0: 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68  urnal uses.** ch
96e0: 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
96f0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
9700: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  does not..*/.sta
9710: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
9720: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
9730: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9740: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
9750: 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65  ager being playe
9760: 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  d back */.  sqli
9770: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 20 20  te3_file *jfd,  
9780: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74 68 61   /* The file tha
9790: 74 20 69 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t is the journal
97a0: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
97b0: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73  ck */.  i64 offs
97c0: 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
97d0: 4f 66 66 73 65 74 20 6f 66 20 74 68 65 20 70 61  Offset of the pa
97e0: 67 65 20 77 69 74 68 69 6e 20 74 68 65 20 6a 6f  ge within the jo
97f0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
9800: 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20 20 20 20  sMainJrnl       
9810: 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d 61 69 6e  /* True for main
9820: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
9830: 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 74 6d  l. False for Stm
9840: 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20 20 69  t jrnl */.){.  i
9850: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
9860: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
9870: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
9880: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
9890: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
98a0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
98c0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
98d0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
98e0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
98f0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9900: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
9910: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
9920: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
9930: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
9940: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
9950: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
9960: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
9970: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d 61 69  e */..  /* isMai
9980: 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20 62 65 20  nJrnl should be 
9990: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
99a0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
99b0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
99c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
99d0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
99e0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
99f0: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9a00: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 69 73 4d  ert( jfd == (isM
9a10: 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
9a20: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
9a30: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
9a40: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
9a50: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
9a60: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
9a70: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
9a80: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9a90: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
9aa0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
9ab0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9ac0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
9ad0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9ae0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
9af0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
9b00: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
9b10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
9b20: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
9b30: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
9b40: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
9b50: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
9b60: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
9b70: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
9b80: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
9b90: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
9ba0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
9bb0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
9bc0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
9bd0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
9be0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
9bf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
9c00: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
9c10: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
9c20: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
9c30: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
9c40: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
9c50: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
9c60: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
9c70: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
9c80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9c90: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
9ca0: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
9cb0: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
9cc0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
9cd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9ce0: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
9cf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
9d00: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
9d10: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
9d20: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
9d30: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9d40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
9d50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9d60: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
9d70: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
9d80: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
9d90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9da0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
9db0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
9dc0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9dd0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
9de0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
9df0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9e00: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
9e10: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
9e20: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
9e30: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
9e40: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
9e50: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
9e60: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
9e70: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
9e80: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
9e90: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
9ea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9eb0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
9ec0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
9ed0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
9ee0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
9ef0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
9f00: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
9f10: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
9f20: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
9f30: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
9f40: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
9f50: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
9f60: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
9f70: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
9f80: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9f90: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
9fa0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
9fb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
9fc0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
9fd0: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
9fe0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
9ff0: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
a000: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
a010: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
a020: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
a030: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
a040: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
a050: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
a060: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
a070: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
a080: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
a090: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
a0a0: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
a0b0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
a0c0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
a0d0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
a0e0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
a0f0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
a100: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a110: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
a120: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
a130: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
a140: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
a150: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
a160: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
a170: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
a180: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
a190: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
a1a0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
a1b0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
a1c0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
a1d0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
a1e0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
a1f0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
a200: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
a210: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
a220: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
a230: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
a240: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
a250: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
a260: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
a270: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
a280: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
a290: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
a2a0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
a2b0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
a2c0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
a2d0: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
a2e0: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
a2f0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
a300: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
a310: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
a320: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
a330: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
a340: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
a350: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
a360: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
a370: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
a380: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
a390: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
a3a0: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
a3b0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
a3c0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
a3d0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
a3e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
a3f0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
a400: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
a410: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
a420: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
a430: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
a440: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
a450: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
a460: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
a470: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
a480: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
a490: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
a4a0: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
a4b0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
a4c0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
a4d0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
a4e0: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
a4f0: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
a500: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
a510: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
a520: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
a530: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
a540: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
a550: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
a560: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
a570: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
a580: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
a590: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
a5a0: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
a5b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
a5c0: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
a5d0: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
a5e0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
a5f0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
a600: 61 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  a));.  if( (pPag
a610: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a620: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
a630: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
a640: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
a650: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
a660: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66 64 2d   && (pPager->fd-
a670: 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a  >pMethods).  ){.
a680: 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
a690: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
a6a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
a6b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a6c0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
a6d0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
a6e0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
a6f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
a700: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
a710: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
a720: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
a730: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
a740: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
a750: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
a760: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
a770: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
a780: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
a790: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
a7a0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
a7b0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
a7c0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
a7d0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
a7e0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
a7f0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
a800: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
a810: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
a820: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
a830: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
a840: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
a850: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
a860: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
a870: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
a880: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a890: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a8a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
a8b0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
a8c0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a8d0: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
a8e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
a8f0: 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
a900: 6c 20 29 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50  l ) makeClean(pP
a910: 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
a920: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
a930: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
a940: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
a950: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
a960: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
a970: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
a980: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
a990: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
a9a0: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
a9b0: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
a9c0: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
a9d0: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
a9e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
a9f0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
aa00: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
aa10: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
aa20: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
aa30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
aa40: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
aa50: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
aa60: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
aa70: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
aa80: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
aa90: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
aaa0: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
aab0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aac0: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
aad0: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
aae0: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
aaf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
ab00: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
ab10: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
ab20: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
ab30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ab40: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
ab50: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
ab60: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
ab70: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
ab80: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
ab90: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aba0: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
abb0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
abc0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
abd0: 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
abe0: 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
abf0: 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
ac00: 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
ac10: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
ac20: 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
ac30: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  nction..**.**.**
ac40: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
ac50: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
ac60: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
ac70: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
ac80: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
ac90: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
aca0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
acb0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
acc0: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
acd0: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
ace0: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
acf0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
ad00: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
ad10: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
ad20: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
ad30: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
ad40: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
ad50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ad60: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
ad70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ad80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
ad90: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
ada0: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
adb0: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
adc0: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
add0: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
ade0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
adf0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
ae00: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
ae10: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
ae20: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
ae30: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
ae40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
ae50: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
ae60: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
ae70: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
ae80: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
ae90: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
aea0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
aeb0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
aec0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
aed0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
aee0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
aef0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
af00: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
af10: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
af20: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
af30: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
af40: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
af50: 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
af60: 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
af70: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
af80: 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
af90: 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
afa0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
afb0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
afc0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
afd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
afe0: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
aff0: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
b000: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
b010: 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
b020: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
b030: 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
b040: 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
b050: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
b060: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b070: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b080: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
b090: 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73  n = 1;..  rc = s
b0a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b0b0: 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
b0c0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
b0d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b0e0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
b0f0: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
b100: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
b110: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
b120: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
b130: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20  MasterPtr = 0;. 
b140: 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74     int nMasterPt
b150: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  r = pPager->pVfs
b160: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
b170: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
b180: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
b190: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
b1a0: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
b1b0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
b1c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
b1d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
b1e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
b1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
b200: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
b210: 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
b220: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
b230: 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a   + nMasterPtr);.
b240: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
b250: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
b260: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
b270: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
b280: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
b290: 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50    }.    zMasterP
b2a0: 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
b2b0: 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
b2c0: 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  nal];.    rc = s
b2d0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
b2e0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
b2f0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
b300: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
b310: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b320: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
b330: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
b340: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
b350: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
b360: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
b370: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
b380: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
b390: 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
b3a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b3b0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
b3c0: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
b3d0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
b3e0: 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  &exists);.      
b3f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b400: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
b410: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b430: 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
b440: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
b450: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
b460: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
b470: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
b480: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
b490: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
b4a0: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
b4b0: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
b4c0: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
b4d0: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
b4e0: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
b4f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b500: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
b510: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b520: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
b530: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
b540: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
b550: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
b560: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
b570: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
b580: 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
b590: 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
b5a0: 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
b5b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b5c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
b5d0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b5e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
b5f0: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
b600: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
b610: 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
b620: 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
b630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
b640: 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
b650: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
b660: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b670: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
b680: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
b690: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
b6a0: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
b6b0: 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
b6c0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
b6d0: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
b6e0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
b6f0: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
b700: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
b710: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
b720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
b730: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
b740: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b760: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
b770: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
b780: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
b790: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
b7a0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
b7b0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
b7c0: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
b7d0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
b7e0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
b7f0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
b800: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
b810: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
b820: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
b830: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
b840: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b850: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
b860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
b870: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b880: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
b890: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
b8a0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
b8b0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
b8c0: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
b8d0: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
b8e0: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
b8f0: 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e  cated. Also trun
b900: 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20  cate the cached 
b910: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b920: 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  f the file..**.*
b930: 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65  * Might might be
b940: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
b950: 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
b960: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
b970: 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63  nPage..** This c
b980: 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
b990: 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72  xample, if we ar
b9a0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
b9b0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
b9c0: 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78  .** which has ex
b9d0: 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20  tended the file 
b9e0: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77  size and the new
b9f0: 20 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c   pages are still
ba00: 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20   all held.** in 
ba10: 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49  cache, then an I
ba20: 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
ba30: 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  does a statement
ba40: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65   rollback.  Some
ba50: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
ba60: 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
ba70: 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
ba80: 66 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79  fused if you try
ba90: 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20   to.** truncate 
baa0: 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
bab0: 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
bac0: 65 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65  er than it curre
bad0: 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64  ntly is,.** so d
bae0: 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
baf0: 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
bb00: 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
bb10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
bb20: 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  ew.** file inste
bb30: 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ad..*/.static in
bb40: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
bb50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bb60: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
bb70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bb80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
bb90: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
bba0: 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72  LUSIVE && pPager
bbb0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
bbc0: 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
bbd0: 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
bbe0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bbf0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
bc00: 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
bc10: 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
bc20: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
bc30: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
bc40: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
bc50: 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
bc60: 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
bc70: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
bc80: 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
bc90: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
bca0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
bcb0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
bcc0: 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
bcd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
bce0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
bcf0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
bd00: 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd20: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
bd30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
bd40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
bd50: 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
bd60: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
bd70: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
bd80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bd90: 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53   Set the sectorS
bda0: 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ize for the give
bdb0: 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  n pager..**.** T
bdc0: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
bdd0: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69  s at least as bi
bde0: 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20  g as the sector 
bdf0: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
be00: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
be10: 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20  torSize().  The 
be20: 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73  minimum sector s
be30: 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73  ize is 512..*/.s
be40: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
be50: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
be60: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
be70: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
be80: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
be90: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
bea0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
beb0: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
bec0: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
bed0: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
bee0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
bef0: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
bf00: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
bf10: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
bf20: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
bf30: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
bf40: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
bf50: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
bf60: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
bf70: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
bf80: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
bf90: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
bfa0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
bfb0: 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
bfc0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
bfd0: 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
bfe0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
bff0: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
c000: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
c010: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
c020: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
c030: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
c040: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
c050: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
c060: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
c070: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
c080: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
c090: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
c0a0: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
c0b0: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
c0c0: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
c0d0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
c0e0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
c0f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c100: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
c110: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
c120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
c130: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
c140: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
c150: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
c160: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
c170: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
c180: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
c190: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
c1a0: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
c1b0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c1c0: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
c1d0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
c1e0: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
c1f0: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
c200: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
c210: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
c220: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
c230: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
c240: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
c250: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
c260: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
c270: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c280: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c290: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
c2a0: 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
c2b0: 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
c2c0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c2d0: 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
c2e0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c2f0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c300: 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
c310: 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
c320: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c330: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c340: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
c350: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
c360: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
c370: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
c380: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
c390: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
c3a0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
c3b0: 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
c3c0: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
c3d0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
c3e0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
c3f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
c400: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
c410: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
c420: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
c430: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
c440: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
c450: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
c460: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
c470: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
c480: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
c490: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
c4a0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
c4b0: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
c4c0: 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
c4d0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
c4e0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
c4f0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
c500: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
c510: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
c520: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
c530: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
c540: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
c550: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
c560: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
c570: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
c580: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
c590: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
c5a0: 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
c5b0: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
c5c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c5d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
c5e0: 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
c5f0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
c600: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
c610: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
c620: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
c630: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
c640: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
c650: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
c660: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
c670: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
c680: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
c690: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
c6a0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c6b0: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
c6c0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
c6d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
c6e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
c6f0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
c700: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
c710: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
c720: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c730: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
c740: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
c750: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
c760: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
c770: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
c780: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
c790: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
c7a0: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
c7b0: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
c7c0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
c7d0: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
c7e0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
c7f0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
c800: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
c810: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
c820: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
c830: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
c840: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
c850: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
c860: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
c870: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
c880: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
c890: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
c8a0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
c8b0: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
c8c0: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
c8d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
c8e0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
c8f0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
c900: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
c910: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
c920: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
c930: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
c940: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
c950: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
c960: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
c970: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
c980: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
c990: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
c9a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c9b0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
c9c0: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
c9d0: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
c9e0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
c9f0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
ca00: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
ca10: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
ca20: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
ca30: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
ca40: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
ca50: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
ca60: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
ca70: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
ca80: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
ca90: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
caa0: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
cab0: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
cac0: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
cad0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
cae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
caf0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
cb00: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
cb10: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
cb20: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cb30: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
cb40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
cb50: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
cb60: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
cb70: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
cb80: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
cb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cba0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
cbb0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
cbc0: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbe0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cbf0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
cc00: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc20: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
cc30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
cc40: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
cc50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cc60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
cc70: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
cc80: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
cc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
cca0: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
ccb0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
ccc0: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
ccd0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
cce0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
ccf0: 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
cd00: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
cd10: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
cd20: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
cd30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
cd40: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
cd50: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
cd60: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
cd70: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
cd80: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
cd90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
cda0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
cdb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cdc0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
cdd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
cde0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
cdf0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
ce00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ce10: 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
ce20: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
ce30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
ce40: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ce50: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
ce60: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
ce70: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
ce80: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
ce90: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
cea0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
ceb0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
cec0: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
ced0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
cee0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
cef0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
cf00: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
cf10: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
cf20: 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
cf30: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
cf40: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
cf50: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
cf60: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
cf70: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
cf80: 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
cf90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cfa0: 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
cfb0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
cfc0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
cfd0: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
cfe0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
cff0: 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
d000: 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
d010: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
d020: 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
d030: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d040: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
d050: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
d060: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
d070: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
d080: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
d090: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
d0a0: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
d0b0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
d0c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
d0d0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
d0e0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
d0f0: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
d100: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
d110: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
d120: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
d130: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
d140: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
d150: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
d160: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
d170: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
d180: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
d190: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
d1a0: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
d1b0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
d1c0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
d1d0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
d1e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d1f0: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
d200: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
d210: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
d220: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
d230: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
d240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
d250: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d260: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
d270: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
d280: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
d290: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
d2a0: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
d2b0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
d2c0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
d2d0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
d2e0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
d2f0: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
d300: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
d310: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
d320: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
d330: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
d340: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
d350: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
d360: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
d370: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
d380: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
d390: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
d3a0: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
d3b0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
d3c0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
d3d0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
d3e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d3f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
d400: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d410: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
d420: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
d430: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d440: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
d450: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
d460: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
d470: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
d480: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
d490: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
d4a0: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
d4b0: 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
d4c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
d4d0: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d4e0: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
d4f0: 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
d500: 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
d510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
d520: 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
d530: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
d540: 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
d550: 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
d560: 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
d570: 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
d580: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
d590: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
d5a0: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
d5b0: 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
d5c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
d5d0: 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
d5e0: 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
d5f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
d600: 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
d610: 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
d620: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
d630: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d640: 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
d650: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d660: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
d670: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d680: 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
d690: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
d6a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
d6b0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
d6c0: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
d6d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
d6e0: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
d6f0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
d700: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
d710: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
d720: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
d730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
d740: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d750: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
d760: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
d770: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
d780: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7a0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
d7b0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
d7c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
d7d0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
d7e0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
d7f0: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
d800: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d810: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
d820: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
d830: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; u++){.      rc
d840: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d850: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d860: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d870: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d880: 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ff, 1);.      if
d890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
d8b0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
d8c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
d8d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d8e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
d8f0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
d900: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d910: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d920: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
d930: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d950: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
d960: 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
d970: 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
d980: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
d990: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d9a0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
d9b0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
d9c0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
d9d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
d9e0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
d9f0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
da00: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
da10: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
da20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
da30: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
da40: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
da50: 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
da60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
da70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
da80: 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
da90: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
daa0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
dab0: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
dac0: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
dad0: 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
dae0: 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
daf0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
db00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
db10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
db20: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
db30: 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
db40: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
db50: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
db60: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
db70: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
db80: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
db90: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
dba0: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
dbb0: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
dbc0: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
dbd0: 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
dbe0: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
dbf0: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
dc00: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
dc10: 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
dc20: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
dc30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dc40: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
dc50: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
dc60: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
dc70: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
dc80: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
dc90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
dca0: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
dcb0: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
dcc0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
dcd0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
dce0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
dcf0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
dd00: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
dd10: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
dd20: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
dd30: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
dd40: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
dd50: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
dd60: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
dd70: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
dd80: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
dd90: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
dda0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
ddb0: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
ddc0: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
ddd0: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
dde0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
ddf0: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
de00: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
de10: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
de20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
de30: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
de40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
de50: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
de60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
de70: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
de80: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
de90: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
dea0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
deb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dec0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
ded0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
dee0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
def0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
df00: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
df10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
df20: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
df30: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
df40: 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  et just after th
df50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
df60: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70  t journal.  ** p
df70: 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  age written befo
df80: 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  re the first jou
df90: 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20  rnal-header for 
dfa0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20  this statement. 
dfb0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
dfc0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20  was written, or 
dfd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
dfe0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
dff0: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
e000: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
e010: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
e020: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
e030: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
e040: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
e050: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
e060: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
e070: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
e080: 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20   .  /* Truncate 
e090: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
e0a0: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
e0b0: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
e0c0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
e0d0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
e0e0: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
e0f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e100: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
e110: 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  RED );..  /* Fig
e120: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
e130: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
e140: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
e150: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
e160: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
e170: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
e180: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
e190: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
e1a0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
e1b0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
e1c0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
e1d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
e1e0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
e1f0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
e200: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
e210: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
e220: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
e230: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
e240: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
e250: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
e260: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
e270: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
e280: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
e290: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
e2a0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
e2b0: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Rec; i++){.    i
e2c0: 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34  64 offset = i*(4
e2d0: 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
e2e0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  e);.    rc = pag
e2f0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
e300: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
e310: 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65  ger->stfd, offse
e320: 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t, 0);.    asser
e330: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
e340: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
e350: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e360: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
e370: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
e380: 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
e390: 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
e3a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
e3b0: 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
e3c0: 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
e3d0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
e3f0: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
e400: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
e410: 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
e420: 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
e430: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
e440: 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
e450: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e460: 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
e470: 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
e480: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
e490: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
e4a0: 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
e4b0: 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
e4c0: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
e4d0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
e4e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
e4f0: 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
e500: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
e510: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
e520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e530: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
e540: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
e550: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
e560: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
e570: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
e580: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68  ->journalOff < h
e590: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20  drOff ){.    rc 
e5a0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
e5b0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
e5c0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
e5d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e5e0: 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  f, 1);.    asser
e5f0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
e600: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
e610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e620: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
e630: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
e640: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
e650: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
e660: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
e670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e680: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
e690: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
e6a0: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
e6b0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
e6c0: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
e6d0: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
e6e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e6f0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
e700: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
e710: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
e720: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
e730: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
e740: 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
e750: 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
e760: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
e770: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
e780: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
e790: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
e7a0: 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
e7b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e7c0: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
e7d0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
e7e0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
e7f0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
e800: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
e810: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
e820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
e830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
e840: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e850: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e860: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
e870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
e880: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e890: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64  ff = szJ;.  .end
e8a0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
e8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e8c0: 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65  _OK) {.    pPage
e8d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e8e0: 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
e8f0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
e900: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
e910: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e920: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
e930: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
e940: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
e950: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
e960: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
e970: 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
e980: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
e990: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
e9a0: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
e9b0: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
e9c0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
e9d0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
e9e0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
e9f0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
ea00: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
ea10: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
ea20: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
ea30: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
ea40: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
ea50: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
ea60: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
ea70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
ea80: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
ea90: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
eaa0: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
eab0: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
eac0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
ead0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
eae0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
eaf0: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
eb00: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
eb10: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
eb20: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
eb30: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
eb40: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
eb50: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
eb70: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
eb80: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
eb90: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
eba0: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
ebb0: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
ebc0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
ebd0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
ebe0: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
ebf0: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
ec00: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
ec10: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
ec20: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
ec30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ec40: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
ec50: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
ec60: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
ec70: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
ec80: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
ec90: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
eca0: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
ecb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
ecc0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
ecd0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
ece0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
ecf0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
ed00: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
ed10: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
ed20: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
ed30: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
ed40: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
ed50: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
ed60: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
ed70: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
ed80: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
ed90: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
eda0: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
edb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
edc0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
edd0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
ede0: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
edf0: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
ee00: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
ee10: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
ee20: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
ee30: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
ee50: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
ee60: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
ee70: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
ee80: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
ee90: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
eea0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
eeb0: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
eec0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
eed0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
eee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eef0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
ef00: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
ef10: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
ef20: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
ef30: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
ef40: 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
ef50: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
ef60: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
ef70: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
ef80: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
ef90: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
efa0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
efb0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  le;.  pPager->sy
efc0: 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
efd0: 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
efe0: 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
eff0: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
f000: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
f010: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
f020: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
f030: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
f040: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
f050: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
f060: 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
f070: 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
f080: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
f090: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
f0a0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
f0b0: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
f0c0: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
f0d0: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
f0e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f0f0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
f100: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
f110: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
f120: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
f130: 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
f140: 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
f150: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
f160: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
f170: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
f180: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
f190: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
f1a0: 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
f1b0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
f1c0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
f1d0: 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
f1e0: 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
f1f0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
f200: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
f210: 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
f220: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f230: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
f240: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
f250: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
f260: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
f270: 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
f280: 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
f290: 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
f2a0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f2b0: 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
f2c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
f2d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f2e0: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
f2f0: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
f300: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
f310: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
f320: 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
f330: 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
f340: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f350: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
f360: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
f370: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f380: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
f390: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
f3a0: 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
f3b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f3c0: 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
f3d0: 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
f3e0: 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
f3f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f400: 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
f410: 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
f420: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
f430: 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
f440: 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f  d *,PgHdr *);../
f450: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
f460: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
f470: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
f480: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
f490: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
f4a0: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
f4b0: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
f4c0: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
f4d0: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
f4e0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
f4f0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
f500: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
f510: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
f520: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
f530: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
f540: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
f550: 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
f560: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f570: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
f580: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
f590: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
f5a0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
f5b0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
f5c0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
f5d0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
f5e0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
f5f0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
f600: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
f610: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
f620: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
f630: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
f640: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
f650: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
f660: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
f670: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
f680: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
f690: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
f6a0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
f6b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
f6c0: 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
f6d0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
f6e0: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
f6f0: 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
f700: 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
f710: 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
f720: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
f730: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f740: 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
f750: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
f760: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
f770: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f780: 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 76  e to open */.  v
f790: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50  oid (*xDesc)(DbP
f7a0: 61 67 65 2a 29 2c 20 20 2f 2a 20 50 61 67 65 20  age*),  /* Page 
f7b0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
f7c0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ion */.  int nEx
f7d0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
f7e0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
f7f0: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
f800: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
f810: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f830: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
f840: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
f850: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
f860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
f870: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
f880: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
f890: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
f8a0: 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
f8b0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a  er *pPager = 0;.
f8c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f8d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
f8e0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
f8f0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
f900: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
f910: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
f920: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
f930: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
f940: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
f950: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
f960: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
f970: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
f980: 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
f990: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f  Size = sqlite3Jo
f9a0: 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b  urnalSize(pVfs);
f9b0: 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
f9c0: 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
f9d0: 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73  eSize();.  int s
f9e0: 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
f9f0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
fa00: 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
fa10: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
fa20: 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
fa30: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ;..  /* The defa
fa40: 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20 61 20  ult return is a 
fa50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  NULL pointer */.
fa60: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
fa70: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
fa80: 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
fa90: 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
faa0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
fab0: 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
fac0: 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
fad0: 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
fae0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
faf0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
fb00: 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
fb10: 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
fb20: 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
fb30: 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
fb40: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
fb50: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
fb60: 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
fb70: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
fb80: 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
fb90: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50  sqlite3Malloc(nP
fba0: 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
fbb0: 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
fbc0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fbd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fbe0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
fbf0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
fc00: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
fc10: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
fc20: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
fc30: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
fc40: 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
fc50: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a   = 0;.    }else.
fc60: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
fc70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fc80: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
fc90: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
fca0: 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
fcb0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
fcc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fcd0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
fce0: 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
fcf0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
fd00: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   rc;.    }.    n
fd10: 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65  Pathname = strle
fd20: 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  n(zPathname);.  
fd30: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
fd40: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
fd50: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
fd60: 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
fd70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
fd80: 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
fd90: 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
fda0: 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
fdb0: 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68  ure */.    pcach
fdc0: 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20  eSize      +    
fdd0: 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
fde0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a   object */.    j
fdf0: 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b  ournalFileSize +
fe00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fe10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
fe20: 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20  tructure */ .   
fe30: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
fe40: 2a 20 33 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  * 3 +        /* 
fe50: 54 68 65 20 6d 61 69 6e 20 64 62 20 61 6e 64 20  The main db and 
fe60: 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
fe70: 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74  s */ .    3*nPat
fe80: 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20 20 20  hname + 40      
fe90: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
fea0: 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20  me, zDirectory, 
feb0: 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b  zJournal */.  );
fec0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29  .  if( !pPager )
fed0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
fee0: 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
fef0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ff00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
ff10: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
ff20: 28 50 43 61 63 68 65 20 2a 29 26 70 50 61 67 65  (PCache *)&pPage
ff30: 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20 3d 20 28  r[1];.  pPtr = (
ff40: 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  (u8 *)&pPager[1]
ff50: 29 20 2b 20 70 63 61 63 68 65 53 69 7a 65 3b 0a  ) + pcacheSize;.
ff60: 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
ff70: 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20  gs = vfsFlags;. 
ff80: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73   pPager->fd = (s
ff90: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
ffa0: 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
ffb0: 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*0];.  pPager->
ffc0: 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  stfd = (sqlite3_
ffd0: 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
ffe0: 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20  ->szOsFile*1];. 
fff0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28   pPager->jfd = (
10000 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
10010 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
10020 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*2];.  pPager-
10030 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
10040 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  ar*)&pPtr[pVfs->
10050 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e  szOsFile*2+journ
10060 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
10070 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
10080 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
10090 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
100a0 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
100b0 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
100c0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50  r->zDirectory[nP
100d0 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
100e0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
100f0 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  s;.  if( zPathna
10100 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  me ){.    memcpy
10110 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
10120 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
10130 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
10140 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
10150 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  athname);.  }.. 
10160 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
10170 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
10180 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10190 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
101a0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
101b0 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56  f( nPathname>(pV
101c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d  fs->mxPathname -
101d0 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61   sizeof("-journa
101e0 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63  l")) ){.      rc
101f0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
10200 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
10210 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
10220 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
10230 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
10240 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10250 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
10260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10270 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
10280 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  ->vfsFlags, &fou
10290 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e  t);.      readOn
102a0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
102b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
102c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
102d0 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
102e0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
102f0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
10300 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20  ccess,.      ** 
10310 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
10320 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
10330 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
10340 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  eate the.      *
10350 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
10360 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
10370 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
10380 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20  ximum of:.      
10390 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  **.      **    +
103a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
103b0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20  PAGE_SIZE,.     
103c0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
103d0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
103e0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
103f0 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ze().      **   
10400 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
10410 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
10420 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
10430 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a  mically..      *
10440 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
10450 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
10460 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10470 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a    int iSectorSiz
10480 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
10490 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
104a0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
104b0 20 73 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63   szPageDflt<iSec
104c0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
104d0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
104e0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
104f0 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
10500 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
10510 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
10520 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
10530 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
10540 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
10550 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
10560 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fd);.          i
10570 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
10580 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
10590 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
105a0 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
105b0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
105c0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
105d0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
105e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
105f0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
10600 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
10610 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
10620 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
10630 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
10640 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
10650 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
10660 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10670 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
10680 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
10690 29 29 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20  )) ) szPageDflt 
106a0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
106b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
106c0 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  if.        if( s
106d0 7a 50 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45  zPageDflt>SQLITE
106e0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
106f0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
10700 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
10710 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
10720 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
10730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10740 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
10750 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
10760 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
10770 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
10780 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
10790 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
107a0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
107b0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
107c0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
107d0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
107e0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
107f0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
10800 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
10810 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
10820 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  te()..    */ .  
10830 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
10840 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
10850 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
10860 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  IVE;.  }..  if( 
10870 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51  pPager && rc==SQ
10880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
10890 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
108a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
108b0 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c 74 29  lloc(szPageDflt)
108c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
108d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
108e0 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
108f0 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20   blocks above.. 
10900 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67   ** Free the Pag
10910 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
10920 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
10930 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  .  ** Since the 
10940 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c  pager is not all
10950 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20  ocated there is 
10960 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a  no need to set .
10970 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65    ** any Pager.e
10980 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73  rrMask variables
10990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
109a0 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d  ager || !pPager-
109b0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
109c0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
109d0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
109e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
109f0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10a00 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
10a10 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  OK)?SQLITE_NOMEM
10a20 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45 78 74  :rc);.  }.  nExt
10a30 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
10a40 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
10a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
10a60 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
10a70 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 20 78 44  xtra, !memDb, xD
10a80 65 73 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20  esc, .          
10a90 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
10aa0 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
10ab0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
10ac0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
10ad0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  ;..  PAGERTRACE3
10ae0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
10af0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
10b00 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
10b10 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
10b20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
10b30 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
10b40 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10b50 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ame))..  /* Fill
10b60 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63   in Pager.zDirec
10b70 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  tory[] */.  memc
10b80 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
10b90 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a  ctory, pPager->z
10ba0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
10bb0 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ame+1);.  for(i=
10bc0 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a  strlen(pPager->z
10bd0 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20  Directory); i>0 
10be0 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
10bf0 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
10c00 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
10c10 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
10c20 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
10c30 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
10c40 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
10c50 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
10c60 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  me ){.    memcpy
10c70 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
10c80 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  l, pPager->zFile
10c90 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
10ca0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
10cb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
10cc0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
10cd0 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c  rnal", 9);.  }el
10ce0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
10cf0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  zJournal = 0;.  
10d00 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  }..  /* pPager->
10d10 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
10d20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
10d30 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
10d40 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
10d50 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
10d60 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
10d70 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
10d80 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
10d90 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
10da0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
10db0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
10dc0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
10dd0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
10de0 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
10df0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
10e00 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66  eSize = szPageDf
10e10 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  lt;.  /* pPager-
10e20 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
10e30 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
10e40 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
10e50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
10e60 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
10e70 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
10e80 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
10e90 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
10ea0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
10eb0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
10ec0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
10ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
10ee0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
10ef0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
10f00 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
10f10 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
10f20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
10f30 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
10f40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
10f50 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
10f60 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
10f70 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
10f80 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
10f90 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
10fa0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
10fb0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
10fc0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
10fd0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
10fe0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
10ff0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11000 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
11010 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
11020 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
11030 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
11040 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
11050 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
11060 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
11070 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
11080 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
11090 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
110a0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
110b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
110c0 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
110d0 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
110e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
110f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
11100 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
11110 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11120 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
11130 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
11140 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11150 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
11160 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
11170 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
11180 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
11190 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
111a0 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
111b0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
111c0 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c  ||memDb||tempFil
111d0 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  e);.  if( !memDb
111e0 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
111f0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
11200 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
11210 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
11220 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
11230 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
11240 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
11250 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
11260 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
11270 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
11280 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11290 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
112a0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
112b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
112c0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
112d0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
112e0 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
112f0 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
11300 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
11310 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
11320 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
11330 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
11340 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
11350 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
11360 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
11370 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
11380 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
11390 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
113a0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
113b0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
113c0 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
113d0 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
113e0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
113f0 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
11400 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
11410 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
11420 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
11430 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
11440 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
11450 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
11460 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11470 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
11480 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
11490 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
114a0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
114b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
114c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
114d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
114e0 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
114f0 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
11500 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
11510 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
11520 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
11530 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
11540 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
11550 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
11560 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11570 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11580 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
11590 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
115a0 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
115b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
115c0 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61  ITE_OK;.  u16 pa
115d0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
115e0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
115f0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
11600 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11610 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
11620 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
11630 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11640 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
11650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11660 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
11670 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
11680 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
11690 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
116a0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
116b0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
116c0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
116d0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
116e0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
116f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
11700 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
11710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11720 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
11730 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
11740 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
11750 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11760 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
11770 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
11780 3e 6d 65 6d 44 62 20 29 20 73 65 74 53 65 63 74  >memDb ) setSect
11790 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
117a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
117b0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
117c0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
117d0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
117e0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
117f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
11800 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
11810 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
11820 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ze);.    }.  }. 
11830 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
11840 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
11850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11860 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
11870 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
11880 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
11890 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
118a0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
118b0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
118c0 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
118d0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
118e0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
118f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
11900 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
11910 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
11920 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
11930 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
11940 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
11950 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
11960 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
11970 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
11980 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
11990 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
119a0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
119b0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
119c0 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
119d0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
119e0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
119f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
11a00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
11a10 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
11a20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
11a30 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
11a40 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
11a50 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11a60 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
11a70 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
11a80 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
11a90 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
11aa0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
11ab0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
11ac0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
11ad0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
11ae0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11af0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
11b00 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
11b10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
11b20 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
11b30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11b40 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11b50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11b60 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
11b70 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
11b80 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11b90 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
11ba0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
11bb0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
11bc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
11bd0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
11be0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
11bf0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
11c00 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
11c10 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
11c20 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
11c30 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
11c40 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
11c50 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
11c60 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
11c70 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
11c80 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
11c90 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
11ca0 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
11cb0 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
11cc0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
11cd0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
11ce0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
11cf0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
11d00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11d10 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
11d20 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11d30 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
11d40 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
11d50 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
11d60 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
11d70 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
11d80 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11d90 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
11da0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
11db0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
11dc0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
11dd0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
11de0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
11df0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11e00 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
11e10 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
11e20 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
11e30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
11e40 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
11e50 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
11e60 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
11e70 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11e80 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
11e90 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
11ea0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
11eb0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11ec0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
11ed0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
11ee0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
11ef0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
11f00 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
11f10 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
11f20 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
11f30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
11f40 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
11f50 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
11f60 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
11f70 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
11f80 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
11f90 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
11fa0 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
11fb0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
11fc0 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
11fd0 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
11fe0 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
11ff0 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
12000 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
12010 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
12020 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
12030 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
12040 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
12050 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
12060 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
12070 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
12080 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
12090 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
120a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
120b0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
120c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
120d0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
120e0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45   N);.  assert(ME
120f0 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d  MDB||pPager->fd-
12100 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
12110 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12120 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
12130 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
12140 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
12150 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
12160 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
12170 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
12180 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
12190 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
121a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
121b0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
121c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
121d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
121e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
121f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12200 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
12210 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
12220 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
12230 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
12240 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
12250 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
12260 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
12270 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
12280 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12290 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
122a0 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
122b0 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
122c0 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
122d0 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
122e0 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
122f0 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
12300 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
12310 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
12320 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
12330 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
12340 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
12350 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
12360 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12370 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12380 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
12390 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
123a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
123b0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
123c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
123d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
123e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
123f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12400 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
12410 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
12420 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
12430 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
12440 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
12450 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
12460 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12470 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
12480 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
12490 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
124a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
124b0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
124c0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
124d0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
124e0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
124f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12500 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12510 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
12520 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12530 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
12540 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
12550 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
12560 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12570 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
12580 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
12590 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
125a0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
125b0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
125c0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
125d0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
125e0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
125f0 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
12600 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12610 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
12620 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
12630 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
12640 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12660 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
12670 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
12680 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12690 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
126a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
126b0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
126c0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
126d0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
126e0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
126f0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
12700 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
12710 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
12720 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
12730 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
12740 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
12750 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
12760 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
12770 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12780 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
12790 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
127a0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
127b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
127c0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
127d0 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
127e0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
127f0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
12800 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
12810 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
12820 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
12830 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
12840 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
12850 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
12860 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
12870 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
12880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12890 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
128a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
128b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
128c0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
128d0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
128e0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
128f0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
12900 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
12910 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
12920 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
12930 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
12940 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
12950 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
12960 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
12970 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
12980 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
12990 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
129a0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
129b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
129c0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
129d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
129e0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
129f0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
12a00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12a10 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
12a20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12a30 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
12a40 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
12a50 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
12a60 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
12a70 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
12a80 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
12a90 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
12aa0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
12ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
12ac0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
12ad0 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
12ae0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
12af0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
12b00 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
12b10 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
12b20 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
12b30 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
12b40 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
12b50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
12b60 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12b70 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
12b80 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20  er->dbSize<0 || 
12b90 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
12ba0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
12bb0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
12bc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
12be0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12bf0 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70  dler ) pPager->p
12c00 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75  BusyHandler->nBu
12c10 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b  sy = 0;.    do {
12c20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12c30 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
12c40 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
12c50 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
12c60 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
12c70 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
12c80 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
12c90 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
12ca0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12cc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
12cd0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20   locktype;.     
12ce0 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
12cf0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
12d00 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
12d10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12d20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
12d30 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
12d40 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
12d50 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
12d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12d70 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
12d80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
12d90 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
12da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12db0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12dc0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
12dd0 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
12de0 0a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ...  sqlite3Page
12df0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
12e00 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  r, 0);.  if( pPa
12e10 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12e20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
12e30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
12e40 65 20 69 66 28 20 6e 50 61 67 65 3c 28 75 6e 73  e if( nPage<(uns
12e50 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
12e60 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
12e70 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
12e80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
12e90 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 61 67  nPage;.      pag
12ea0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12eb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  e(pPager);.    }
12ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
12ed0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
12ee0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
12ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12f00 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
12f10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12f20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12f30 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
12f40 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
12f50 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
12f60 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
12f70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
12f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12fb0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
12fc0 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
12fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12fe0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
12ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
13000 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13010 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
13020 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
13030 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
13040 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
13050 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
13060 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
13070 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
13080 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
13090 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
130a0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
130b0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
130c0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
130d0 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
130e0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
130f0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
13100 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
13110 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
13120 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
13130 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
13140 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
13150 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
13160 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
13170 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
13180 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
13190 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
131a0 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
131b0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
131c0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
131d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
131e0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
131f0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
13200 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
13210 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
13220 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
13230 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
13240 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
13250 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13260 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
13270 67 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65  ger){..  disable
13280 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13290 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
132a0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
132b0 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
132c0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
132d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
132e0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
132f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
13300 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
13310 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
13320 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
13330 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
13340 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
13350 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13360 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
13370 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
13380 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
13390 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
133a0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
133b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
133c0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
133d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
133e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
133f0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13400 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13410 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73  pInJournal);.  s
13420 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
13430 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  roy(pPager->pAlw
13440 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  aysRollback);.  
13450 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
13460 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
13470 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13480 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
13490 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
134a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
134b0 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
134c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
134d0 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
134e0 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
134f0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
13500 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
13510 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
13520 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
13530 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61   */..  sqlite3Pa
13540 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
13550 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
13560 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
13570 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13590 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
135a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
135b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
135c0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
135d0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
135e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
135f0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
13600 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
13610 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
13620 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
13630 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
13640 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
13650 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13660 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
13670 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
13680 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
13690 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
136a0 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
136b0 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
136c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
136d0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
136e0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
136f0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
13700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13710 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
13720 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
13730 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13740 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
13750 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
13760 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
13770 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
13780 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
13790 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
137a0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
137b0 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
137c0 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
137d0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
137e0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
137f0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
13800 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
13810 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
13820 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
13830 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
13840 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13850 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
13860 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
13870 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
13880 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
13890 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
138a0 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
138b0 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
138c0 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
138d0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
138e0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
138f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
13900 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
13910 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
13920 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
13930 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
13940 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
13950 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
13960 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
13970 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
13980 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
13990 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
139a0 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
139b0 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
139c0 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
139d0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
139e0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
139f0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
13a00 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
13a10 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
13a20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
13a30 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
13a40 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
13a50 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
13a60 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
13a70 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
13a80 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
13a90 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
13aa0 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
13ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
13ac0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
13ad0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
13ae0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
13af0 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
13b00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13b10 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
13b20 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
13b30 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
13b40 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
13b50 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
13b60 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
13b70 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
13b80 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
13b90 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
13ba0 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
13bb0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
13bc0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
13bd0 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
13be0 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
13bf0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
13c00 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
13c10 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
13c20 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
13c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13c40 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
13c50 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
13c60 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
13c70 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
13c80 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
13c90 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
13ca0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
13cb0 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
13cc0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13cd0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
13ce0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13cf0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
13d00 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
13d10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
13d20 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13d30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
13d50 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
13d60 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
13d70 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
13d80 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
13d90 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13da0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
13db0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
13dc0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
13dd0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
13de0 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
13df0 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
13e00 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
13e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
13e20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
13e30 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
13e40 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
13e50 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
13e60 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
13e70 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
13e80 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
13e90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
13ea0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
13eb0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
13ec0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
13ed0 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
13ee0 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
13ef0 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
13f00 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
13f10 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
13f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
13f30 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
13f40 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
13f50 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
13f60 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
13f70 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
13f80 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
13f90 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
13fa0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
13fb0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
13fc0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
13fd0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
13fe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13ff0 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20  i64 jrnlOff;.   
14000 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
14010 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
14020 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
14030 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
14040 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
14050 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
14060 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
14070 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
14080 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
14090 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
140a0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
140d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
140e0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  c_flags);.      
140f0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
14100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14110 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72     }..        jr
14120 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
14130 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
14140 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
14150 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c);.        IOTR
14160 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
14170 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
14180 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a  , jrnlOff, 4));.
14190 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
141a0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
141b0 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
141c0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
141d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
141e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
141f0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
14200 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
14210 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
14220 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
14230 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
14240 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
14250 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14260 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14270 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
14280 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
14290 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
142a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
142b0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
142c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
142d0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
142e0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
142f0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
14300 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
14310 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
14320 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
14330 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
14340 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14350 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
14360 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14370 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
14380 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
14390 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
143a0 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
143b0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
143c0 65 33 50 63 61 63 68 65 53 65 74 46 6c 61 67 73  e3PcacheSetFlags
143d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
143e0 2c 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  , ~PGHDR_NEED_SY
143f0 4e 43 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 6c  NC, 0);.    /* l
14400 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
14410 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f  nced(pPager); */
14420 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
14430 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
14440 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
14450 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
14460 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
14470 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
14480 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
14490 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
144a0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
144b0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
144c0 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
144d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
144e0 69 74 65 33 50 63 61 63 68 65 41 73 73 65 72 74  ite3PcacheAssert
144f0 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
14500 43 61 63 68 65 2c 20 30 2c 20 50 47 48 44 52 5f  Cache, 0, PGHDR_
14510 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
14520 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65  /* assert( pPage
14530 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
14540 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75  ced==pPager->lru
14550 2e 70 46 69 72 73 74 20 29 3b 20 2a 2f 0a 20 20  .pFirst ); */.  
14560 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
14570 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14580 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
14590 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
145a0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
145b0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
145c0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
145d0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
145e0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
145f0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c  ase file. No cal
14600 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74  ls are made.** t
14610 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
14620 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
14630 65 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20  es as clean. It 
14640 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
14650 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20  ility.** of the 
14660 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63  caller to use Pc
14670 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f  acheCleanAll() o
14680 72 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  r PcacheMakeClea
14690 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74  n() to mark.** t
146a0 68 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61  he pages as clea
146b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
146c0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
146d0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
146e0 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
146f0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14700 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14710 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14720 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14730 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
14740 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
14750 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
14760 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
14770 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
14780 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
14790 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
147a0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
147b0 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
147c0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
147d0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
147e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
147f0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14800 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14810 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14820 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14830 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
14840 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
14850 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
14860 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
14870 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
14880 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
14890 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
148a0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
148b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
148c0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
148d0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
148e0 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
148f0 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14900 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14910 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14920 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14930 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14940 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
14950 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
14960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
14970 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14980 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
14990 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
149a0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
149b0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
149c0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
149d0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
149e0 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
149f0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14a00 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14a10 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14a20 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14a30 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14a40 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
14a50 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
14a60 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
14a70 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
14a80 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
14a90 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
14aa0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
14ab0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
14ac0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
14ad0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
14ae0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
14af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14b10 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
14b20 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
14b30 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
14b40 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
14b50 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
14b60 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
14b70 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
14b80 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
14b90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14ba0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14bb0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
14bc0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
14bd0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
14be0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
14bf0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14c00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14c10 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
14c20 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
14c30 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
14c40 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
14c50 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
14c60 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
14c70 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
14c80 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
14c90 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
14ca0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
14cb0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
14cc0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
14cd0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
14ce0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
14cf0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
14d00 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
14d10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
14d20 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
14d30 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
14d40 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
14d50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
14d60 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
14d70 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
14d80 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
14d90 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
14da0 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
14db0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
14dc0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73  ist->pData, pLis
14dd0 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
14de0 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
14df0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
14e00 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
14e30 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
14e40 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
14e50 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49  pList));.      I
14e60 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14e70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
14e80 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
14e90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14ea0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
14eb0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
14ec0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
14ed0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41  ffset);.      PA
14ee0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
14ef0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
14f00 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
14f10 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
14f20 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
14f30 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
14f40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
14f50 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
14f60 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
14f70 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
14f80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
14f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14fa0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
14fb0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
14fc0 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
14fd0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
14fe0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14ff0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
15000 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15010 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
15020 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
15030 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
15040 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
15050 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
15060 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
15070 6e 64 69 66 0a 20 20 20 20 2f 2a 20 6d 61 6b 65  ndif.    /* make
15080 43 6c 65 61 6e 28 70 4c 69 73 74 29 3b 20 2a 2f  Clean(pList); */
15090 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
150a0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
150b0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 50 63 61  .  /* sqlite3Pca
150c0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
150d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 20 2a 2f  er->pPCache); */
150e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
150f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
15100 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15110 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
15120 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
15130 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
15140 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
15150 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67  y limit. The arg
15160 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
15170 65 72 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c  er to a purgeabl
15180 65 20 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65  e Pager .** obje
15190 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
151a0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61  n attempts to ma
151b0 6b 65 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74  ke a single dirt
151c0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
151d0 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  no.** outstandin
151e0 67 20 72 65 66 65 72 65 6e 63 65 73 20 28 69 66  g references (if
151f0 20 6f 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65   one exists) cle
15200 61 6e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  an so that it ca
15210 6e 20 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a  n be recycled .*
15220 2a 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  * by the pcache 
15230 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
15240 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
15250 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
15260 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
15270 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
15280 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
15290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
152a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
152b0 79 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ync ){.    retur
152c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
152d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
152e0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
152f0 54 59 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  TY );.  if( pPag
15300 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
15310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15320 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
15330 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
15340 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
15350 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
15360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15370 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
15380 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a  r->fullSync && .
15390 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65          !(sqlite
153a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
153b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
153c0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
153d0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
153e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
153f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
15400 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
15410 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
15420 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
15430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
15440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15450 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
15460 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
15470 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
15480 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
15490 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
154a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
154b0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
154c0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
154d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
154e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
15500 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
15510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15520 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
15530 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
15540 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
15550 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
15560 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
15570 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
15580 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
15590 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
155a0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
155b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
155c0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
155d0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
155e0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
155f0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
15600 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
15610 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
15620 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
15630 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
15640 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
15650 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ournal..**.** Re
15660 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
15670 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72   unable to deter
15680 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20  mine the status 
15690 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
156a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
156b0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e  ne does not open
156c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
156d0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73  e to examine its
156e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65  .** content.  He
156f0 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nce, the journal
15700 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74   might contain t
15710 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
15720 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
15730 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
15740 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68  n deleted, and h
15750 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e  ence not be hot.
15760 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64    Or.** the head
15770 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
15780 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65  l might be zeroe
15790 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75  d out.  This rou
157a0 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  tine.** does not
157b0 20 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20   discover these 
157c0 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68  cases of a non-h
157d0 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20  ot journal - if 
157e0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
157f0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
15800 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73  s not empty this
15810 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
15820 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20   it.** is hot.  
15830 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
15840 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
15850 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
15860 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
15870 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
15880 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e  y hot and will n
15890 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
158a0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
158b0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
158c0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
158d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
158e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
158f0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
15900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15910 65 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 6c 6f  exists;.  int lo
15920 63 6b 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  cked;.  assert( 
15930 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
15940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
15950 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
15960 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
15970 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
15980 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
15990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
159a0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
159b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
159c0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
159d0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
159e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
159f0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
15a00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15a10 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
15a20 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
15a30 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20 69  locked);.  }.  i
15a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15a50 20 26 26 20 65 78 69 73 74 73 20 26 26 20 21 6c   && exists && !l
15a60 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  ocked ){.    int
15a70 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d   nPage;.    rc =
15a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
15a90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
15aa0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
15ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15ac0 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  .     if( nPage=
15ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15ae0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
15af0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
15b00 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
15b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
15b20 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
15b30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15b50 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
15b60 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
15b70 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
15b80 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
15b90 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
15ba0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
15bb0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
15bc0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
15bd0 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
15be0 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
15bf0 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
15c00 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
15c10 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
15c20 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
15c30 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
15c40 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
15c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15c60 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
15c70 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
15c80 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
15c90 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15ca0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
15cb0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
15cc0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65  Pg->pData, pPage
15cd0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
15ce0 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
15cf0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
15d00 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
15d10 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
15d20 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
15d30 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
15d40 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15d50 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
15d60 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
15d70 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
15d80 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
15d90 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 2c  pPg->pData)[24],
15da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15dd0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
15de0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
15df0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
15e00 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
15e10 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
15e20 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
15e30 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
15e40 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
15e50 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
15e60 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
15e70 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
15e80 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
15e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
15ea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15eb0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
15ec0 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
15ed0 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
15ee0 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
15ef0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
15f00 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
15f10 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
15f20 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
15f30 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
15f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15f50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
15f60 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
15f70 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
15f80 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
15f90 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
15fa0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
15fb0 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
15fc0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
15fd0 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
15fe0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
15ff0 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
16000 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
16010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16020 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
16030 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
16040 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16050 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  K;.  int isError
16060 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Reset = 0;..  /*
16070 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
16080 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20  e is opened for 
16090 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
160a0 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  , has no outstan
160b0 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20  ding .  ** page 
160c0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69  references and i
160d0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
160e0 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20  ate, now is the 
160f0 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a  chance to clear.
16100 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20    ** the error. 
16110 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
16120 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
16130 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61  r-cache and trea
16140 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20  t any.  ** open 
16150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20  journal file as 
16160 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  a hot-journal.. 
16170 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42   */.  if( !MEMDB
16180 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   && pPager->excl
16190 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
161a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
161b0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
161c0 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50  PCache)==0 && pP
161d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20  ager->errCode . 
161e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
161f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
16200 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
16210 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
16220 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
16230 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
16240 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
16250 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
16260 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
16270 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e  r is still in an
16280 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
16290 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68   not proceed. Th
162a0 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74  e error .  ** st
162b0 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ate will be clea
162c0 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  red at some poin
162d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
162e0 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20  when all page . 
162f0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61   ** references a
16300 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74  re dropped and t
16310 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  he cache can be 
16320 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a  discarded..  */.
16330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16340 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
16350 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
16360 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
16370 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
16380 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ode;.  }..  if( 
16390 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
163a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
163b0 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
163c0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
163d0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
163e0 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  Vfs;.    if( !ME
163f0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  MDB ){.      int
16400 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 3b 0a 20   isHotJournal;. 
16410 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
16420 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
16430 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
16440 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
16450 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
16460 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16470 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16480 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16490 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
164a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
164b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
164c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
164d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
164e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
164f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16500 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16510 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
16520 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
16530 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
16540 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
16550 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
16560 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
16570 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
16580 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
16590 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
165a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
165b0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
165c0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
165d0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
165e0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
165f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16600 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
16610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16620 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
16630 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
16640 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
16650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
16670 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
16680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16690 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
166a0 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
166b0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  al ){.        /*
166c0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
166d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
166e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
166f0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
16700 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
16710 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
16720 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
16730 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
16740 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
16750 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
16760 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
16770 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
16780 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
16790 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
167a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
167b0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
167c0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
167d0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
167e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
167f0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
16800 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
16810 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
16820 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
16830 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
16840 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
16850 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
16860 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
16870 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
16880 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
16890 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
168a0 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
168b0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
168c0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
168d0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
168e0 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  * obtain its own
168f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16900 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16910 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
16920 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
16930 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
16940 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16960 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
16970 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
16980 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
16990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
169b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
169c0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
169d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
169e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
169f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
16a00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
16a10 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
16a20 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20          }. .    
16a30 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
16a40 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
16a50 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
16a60 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
16a70 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
16a80 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
16a90 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
16aa0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
16ab0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
16ac0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
16ad0 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
16ae0 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
16af0 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
16b00 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
16b10 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
16b20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
16b30 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
16b40 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
16b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
16b60 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
16b70 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
16b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
16b90 45 72 72 6f 72 52 65 73 65 74 20 26 26 20 70 50  ErrorReset && pP
16ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16bb0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
16bc0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
16bd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16be0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
16bf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
16c00 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
16c10 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20  ISTS,&res);.    
16c20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16c40 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
16c50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16c60 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
16c70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
16c80 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
16c90 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
16ca0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
16cb0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
16cc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
16cd0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
16cf0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
16d00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
16d10 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
16d20 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
16d40 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16d50 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
16d60 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16d80 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  ( fout&SQLITE_OP
16d90 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16db0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16dd0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
16de0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16e00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
16e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
16e20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
16e30 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
16e40 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65   that means some
16e50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
16e70 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
16e80 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
16e90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
16ea0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16eb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ed0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
16ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
16f00 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
16f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
16f20 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20  R_UNLOCK .      
16f30 20 20 20 20 20 26 26 20 72 63 21 3d 53 51 4c 49       && rc!=SQLI
16f40 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 0a  TE_IOERR_NOMEM .
16f50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
16f60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16f70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16f90 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
16fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16fb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16fc0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
16fd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16fe0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
16ff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17000 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
17010 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
17020 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
17030 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17040 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
17050 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
17060 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
17070 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
17080 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
17090 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
170a0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
170b0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
170c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
170d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
170e0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
170f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
17120 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17130 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17140 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
17150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17160 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
17170 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
17180 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
17190 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
171a0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
171b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
171c0 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
171d0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
171e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
171f0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
17200 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
17210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
17220 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
17230 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
17240 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
17250 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
17260 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
17270 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
17280 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
17290 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
172a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64  .        ** read
172b0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
172c0 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
172d0 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
172e0 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  abase.        **
172f0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
17300 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
17310 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
17320 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
17330 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
17340 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
17350 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
17360 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
17370 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
17380 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
17390 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20  g.        ** at 
173a0 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
173b0 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
173c0 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
173d0 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
173e0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
173f0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
17400 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
17410 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
17420 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74  he.        ** ot
17430 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
17440 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
17450 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
17460 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
17470 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
17480 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  e..        ** . 
17490 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20         ** There 
174a0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
174b0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
174c0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
174d0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20   not be .       
174e0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
174f0 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
17500 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
17510 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
17520 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  at.        ** it
17530 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
17540 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
17550 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
17560 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
17570 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
17580 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
17590 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
175a0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
175b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
175c0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
175d0 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
175e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
175f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
17600 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ed;.        }.. 
17610 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
17620 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
17630 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
17640 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
17650 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
17660 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
17670 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
17680 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
17690 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
176a0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
176b0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
176c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
176d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
176e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
176f0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
17700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
17710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
17720 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
17730 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
17740 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
17750 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
17760 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
17770 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
17780 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
17790 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
177a0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
177b0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
177c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
177d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
177e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
177f0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
17800 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
17810 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
17820 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17830 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
17840 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17850 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
17860 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
17870 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
17880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17890 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
178a0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
178b0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
178c0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
178d0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
178e0 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
178f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
17900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17910 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
17920 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
17930 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
17940 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
17950 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
17960 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
17970 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
17980 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
17990 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
179a0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
179b0 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
179c0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
179d0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
179e0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
179f0 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
17a00 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
17a10 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
17a20 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
17a30 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
17a40 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
17a50 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
17a60 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
17a70 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
17a80 26 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  &PGHDR_NEED_READ
17a90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
17aa0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
17ab0 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
17ac0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
17ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17ae0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  ){.      pPg->fl
17af0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17b00 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c  ED_READ;.    }el
17b10 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
17b20 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
17b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
17b50 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
17b60 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
17b70 65 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61 67  ero, and the pag
17b80 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  er is not in the
17b90 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  .** middle of a 
17ba0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17bb0 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20 65  n or opened in e
17bc0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 75  xclusive mode, u
17bd0 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74  nlock it..*/ .st
17be0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
17bf0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
17c00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17c10 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
17c20 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
17c30 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a  r->pPCache)==0).
17c40 20 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d      && (!pPager-
17c50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
17c60 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
17c70 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20  lOff>0) .  ){.  
17c80 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
17c90 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
17ca0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
17cb0 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20  rop a page from 
17cc0 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
17cd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
17ce0 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  p()..**.** If th
17cf0 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
17d00 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20  re now no pages 
17d10 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20  with references 
17d20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62  to them, a rollb
17d30 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e  ack.** occurs an
17d40 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
17d50 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
17d60 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  moved..*/.static
17d70 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50   void pagerDropP
17d80 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  age(DbPage *pPg)
17d90 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
17da0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
17db0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
17dc0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67  Drop(pPg);.  pag
17dd0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
17de0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
17df0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
17e00 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
17e10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
17e20 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
17e30 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
17e40 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
17e50 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
17e60 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
17e70 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
17e80 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
17e90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17ea0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
17eb0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
17ec0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
17ed0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
17ee0 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
17ef0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
17f00 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
17f10 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
17f20 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
17f30 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
17f40 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
17f50 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
17f60 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
17f70 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
17f80 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
17f90 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
17fa0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
17fb0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
17fc0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
17fd0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
17fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
17ff0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
18000 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
18010 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
18020 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
18030 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
18040 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
18050 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
18060 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
18070 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
18080 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
18090 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
180a0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
180b0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
180c0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
180d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
180e0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
180f0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
18100 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
18110 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
18120 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
18130 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
18140 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
18150 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
18160 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
18170 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
18180 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18190 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
181a0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
181b0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
181c0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
181d0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
181e0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
181f0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
18200 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
18210 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
18220 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
18230 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
18240 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
18250 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
18260 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
18270 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
18280 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
18290 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
182a0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
182b0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
182c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
182d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
182e0 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
182f0 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
18300 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
18310 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
18320 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
18330 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
18340 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
18350 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
18360 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
18370 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
18380 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
18390 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
183a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
183b0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
183c0 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
183d0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
183e0 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
183f0 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
18400 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
18410 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
18420 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
18430 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
18440 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
18450 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
18460 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
18470 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
18480 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
18490 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
184a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
184b0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
184c0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
184d0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
184e0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
184f0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
18500 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
18510 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
18520 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
18530 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
18540 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
18550 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
18560 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
18570 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
18580 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
18590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
185a0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
185b0 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20  _UNLOCK .       
185c0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
185d0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
185e0 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
185f0 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 0a      || pgno==1 .
18600 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    );..  /* The m
18610 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
18620 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
18630 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18640 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
18650 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
18660 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
18670 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
18680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
18690 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
186a0 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
186b0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
186c0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
186d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
186e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
186f0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
18700 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
18710 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
18720 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
18730 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
18740 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
18750 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
18760 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
18770 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
18780 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
18790 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
187a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
187b0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
187c0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
187d0 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
187e0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
187f0 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
18800 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
18810 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
18820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18830 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18840 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18850 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18860 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
18870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
18880 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
18890 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
188a0 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  1, &pPg);.  if( 
188b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
188c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
188d0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
188e0 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
188f0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
18900 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
18910 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
18920 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
18930 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
18940 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  alized..    */. 
18950 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
18960 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
18970 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
18980 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
18990 61 67 65 72 3b 0a 20 20 20 20 69 66 28 20 73 71  ager;.    if( sq
189a0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
189b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
189c0 61 6c 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  al, pgno) ){.   
189d0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
189e0 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41   PGHDR_IN_JOURNA
189f0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  L;.    }.    mem
18a00 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61 2c  set(pPg->pExtra,
18a10 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
18a20 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ra);..    rc = s
18a30 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18a40 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
18a50 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
18a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18a80 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18aa0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   }..    if( nMax
18ab0 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
18ac0 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  MDB || noContent
18ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
18ae0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
18af0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
18b00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
18b10 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
18b20 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
18b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
18b40 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
18b50 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
18b60 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
18b70 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
18b80 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
18b90 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
18ba0 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  READ;.      }.  
18bb0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
18bc0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
18bd0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
18be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18bf0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
18c00 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29  ager, pPg, pgno)
18c10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18c20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
18c30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
18c40 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
18c50 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50 61      /* sqlite3Pa
18c60 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20 2a  gerUnref(pPg); *
18c70 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 44  /.        pagerD
18c80 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20  ropPage(pPg);.  
18c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
18cb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
18cc0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
18cd0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
18ce0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
18cf0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
18d00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
18d10 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
18d20 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
18d30 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
18d40 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
18d50 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
18d60 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f  Cache)>0 || pgno
18d70 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
18d80 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
18d90 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
18da0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
18db0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
18dc0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
18dd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18de0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18df0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
18e00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18e20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  }..  *ppPage = p
18e30 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
18e40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
18e50 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
18e60 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
18e70 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
18e80 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
18e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18ea0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
18eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
18ec0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
18ed0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
18ee0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
18ef0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
18f00 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
18f10 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
18f20 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
18f30 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
18f40 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
18f50 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
18f60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
18f70 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70  = pagerAcquire(p
18f80 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50  Pager, pgno, ppP
18f90 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
18fa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18fb0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
18fc0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
18fd0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
18fe0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
18ff0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
19000 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
19010 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
19020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
19030 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
19040 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
19050 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
19060 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
19070 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
19080 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
19090 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
190a0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
190b0 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
190c0 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
190d0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
190e0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
190f0 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
19100 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
19110 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
19120 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
19130 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
19140 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
19150 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
19160 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
19170 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
19180 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
19190 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
191a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
191b0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
191c0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
191d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
191e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
191f0 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  !=0 );..  if( (p
19200 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
19210 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26  GER_UNLOCK).   &
19220 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  & (pPager->errCo
19230 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
19240 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19250 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20  ==SQLITE_FULL). 
19260 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
19270 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
19280 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
19290 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a  , 0, &pPg);.  }.
192a0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
192b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
192c0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
192d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
192e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
192f0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
19300 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
19310 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
19320 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
19330 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
19340 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
19350 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
19360 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
19370 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
19380 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19390 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
193a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
193b0 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
193c0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
193d0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
193e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
193f0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
19400 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
19410 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
19420 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
19430 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
19440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19450 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
19460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19470 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
19480 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
19490 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
194a0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
194b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
194c0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
194d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
194e0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
194f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
19500 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
19510 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
19520 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
19530 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
19540 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
19550 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19560 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
19570 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
19580 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
19590 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
195a0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
195b0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
195c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
195d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
195e0 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
195f0 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
19600 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
19610 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
19620 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19630 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19650 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
19660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19670 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19680 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
19690 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
196a0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61  Pager, 0);.  pPa
196b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
196c0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
196d0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
196e0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
196f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
19700 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
19710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19720 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19730 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19740 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
19750 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
19760 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
19770 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
19780 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
19790 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
197a0 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
197b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
197c0 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  L);.    }else{. 
197d0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
197e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
197f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
19800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19810 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
19820 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  E.    rc = sqlit
19830 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
19840 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
19850 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
19860 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
19870 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
19880 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  e(pPager).    );
19890 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
198a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
198b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
198c0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
198d0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
198e0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
198f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
19900 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
19910 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70  Methods );.    p
19920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19930 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
19940 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
19950 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
19960 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
19970 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19980 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
19990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
199a0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M ){.        sql
199b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
199c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
199d0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
199e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
199f0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19a00 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  al;.    }.  }.  
19a10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19a20 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
19a30 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19a40 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
19a50 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
19a60 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
19a70 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
19a80 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19a90 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19aa0 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
19ab0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19ac0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
19ad0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
19ae0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19af0 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
19b00 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
19b10 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19b20 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
19b30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19b40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19b50 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
19b60 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
19b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19b80 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
19b90 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
19ba0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
19bb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
19bc0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
19bd0 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
19be0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19c00 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
19c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19c20 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
19c30 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
19c40 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
19c50 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
19c60 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
19c70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19c80 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
19c90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
19ca0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
19cb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19cc0 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
19cd0 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
19ce0 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
19cf0 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
19d00 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
19d10 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19d20 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
19d30 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
19d40 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19d50 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19d60 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19d70 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
19d80 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
19d90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
19da0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
19db0 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
19dc0 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
19dd0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
19de0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
19df0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
19e00 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
19e10 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
19e20 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
19e30 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
19e40 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
19e50 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
19e60 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
19e70 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
19e80 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
19e90 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
19ea0 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
19eb0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
19ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
19ed0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
19ee0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
19ef0 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
19f00 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
19f10 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
19f20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19f30 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
19f40 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
19f50 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
19f60 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
19f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
19f80 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
19f90 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
19fa0 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
19fb0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
19fc0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
19fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19fe0 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
19ff0 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1a000 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1a010 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1a020 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1a030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1a040 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1a050 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1a060 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a070 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1a080 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1a090 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1a0a0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1a0b0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1a0c0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1a0d0 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1a0e0 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1a0f0 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1a100 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1a110 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1a120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1a130 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1a140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1a150 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1a160 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1a170 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1a180 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1a190 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1a1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a1b0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1a1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a1d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1a1e0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1a1f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1a200 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1a210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a220 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1a230 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1a240 50 63 61 63 68 65 41 73 73 65 72 74 46 6c 61 67  PcacheAssertFlag
1a250 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
1a260 65 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a  e, 0, PGHDR_IN_J
1a270 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28  OURNAL);.    if(
1a280 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1a290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1a2a0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1a2b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1a2c0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1a2d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1a2f0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1a300 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
1a310 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
1a320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a330 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1a340 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1a350 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
1a360 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
1a370 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
1a380 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1a390 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1a3a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1a3b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a3c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
1a3d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a3e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a400 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1a410 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
1a420 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
1a430 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1a440 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a450 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a460 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
1a470 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1a490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a4a0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a4b0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
1a4c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a4d0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1a4e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
1a4f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1a500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a510 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1a520 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
1a530 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
1a540 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
1a550 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
1a560 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
1a570 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
1a580 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1a590 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1a5a0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1a5b0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1a5c0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1a5d0 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1a5e0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1a5f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a600 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1a610 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
1a620 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
1a630 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
1a640 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
1a650 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
1a660 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
1a670 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1a680 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
1a690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a6a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a6b0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
1a6c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1a6d0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1a6e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1a6f0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
1a700 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
1a710 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1a720 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
1a730 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1a740 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1a750 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1a760 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a770 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1a780 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
1a790 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1a7a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1a7b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1a7c0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1a7d0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1a7e0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1a7f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
1a800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a810 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
1a820 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
1a830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a840 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
1a850 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
1a860 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
1a870 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
1a880 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
1a890 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1a8a0 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
1a8b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1a8c0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
1a8d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1a8e0 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
1a8f0 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
1a900 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
1a910 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
1a920 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
1a930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1a940 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
1a950 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
1a960 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
1a970 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  );.}.../*.** Mar
1a980 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
1a990 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
1a9a0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
1a9b0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1a9c0 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
1a9d0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1a9e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a9f0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
1aa00 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
1aa10 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
1aa20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1aa30 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1aa40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1aa50 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
1aa60 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
1aa70 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
1aa80 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1aa90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1aaa0 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
1aab0 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
1aac0 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
1aad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1aae0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
1aaf0 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
1ab00 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
1ab10 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
1ab20 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
1ab30 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
1ab40 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
1ab50 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
1ab60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1ab70 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1ab80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
1ab90 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
1aba0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1abb0 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
1abc0 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
1abd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1abe0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
1abf0 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
1ac00 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
1ac10 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
1ac20 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
1ac30 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
1ac40 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
1ac50 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
1ac60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
1ac70 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
1ac80 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1ac90 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
1aca0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1acb0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
1acc0 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
1acd0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
1ace0 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
1acf0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1ad00 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
1ad10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1ad20 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
1ad30 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
1ad40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
1ad50 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1ad60 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1ad70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
1ad80 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
1ad90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
1ada0 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
1adb0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1adc0 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
1add0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1ade0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77  * If this page w
1adf0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  as previously ac
1ae00 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1ae10 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d  ntent==1, that m
1ae20 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64  eans.  ** we did
1ae30 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20  n't really read 
1ae40 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
1ae50 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  f the page.  Thi
1ae60 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a  s can happen.  *
1ae70 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20  * (for example) 
1ae80 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  when the page is
1ae90 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
1aea0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42  the freelist.  B
1aeb0 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61  ut.  ** now we a
1aec0 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76  re (perhaps) mov
1aed0 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66  ing the page off
1aee0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1aef0 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20   for.  ** reuse 
1af00 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  and we need to k
1af10 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  now its original
1af20 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74   content so that
1af30 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61   content.  ** ca
1af40 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  n be stored in t
1af50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1af60 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20  nal.  So do the 
1af70 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a  read at this.  *
1af80 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72  * time..  */.  r
1af90 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1afa0 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
1afb0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1afc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1afd0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1afe0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
1aff0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
1b000 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
1b010 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
1b020 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
1b030 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
1b040 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72  ..  */.  makeDir
1b050 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 28  ty(pPg);.  if( (
1b060 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1b070 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  _IN_JOURNAL).   
1b080 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d  && (pageInStatem
1b090 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67  ent(pPg) || pPag
1b0a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1b0b0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  ) .  ){.    pPag
1b0c0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1b0d0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1b0e0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
1b0f0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
1b100 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
1b110 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
1b120 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1b130 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
1b140 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
1b150 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1b160 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
1b170 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
1b180 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
1b190 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1b1a0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
1b1b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1b1c0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
1b1d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
1b1e0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
1b1f0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
1b200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b210 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1b220 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
1b230 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1b240 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  in(pPg, 0);.    
1b250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b260 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1b270 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1b280 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b290 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1b2a0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
1b2b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1b2c0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
1b2d0 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
1b2e0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
1b2f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1b300 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1b310 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OFF ){.      rc 
1b320 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1b330 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1b340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b350 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b360 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
1b370 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b380 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1b390 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
1b3a0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
1b3b0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1b3c0 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
1b3d0 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
1b3e0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
1b3f0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1b400 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
1b410 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
1b420 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1b430 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
1b440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1b450 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
1b460 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1b470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b480 20 21 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   !(pPg->flags&PG
1b490 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  HDR_IN_JOURNAL) 
1b4a0 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  && (pPager->jour
1b4b0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42  nalOpen || MEMDB
1b4c0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
1b4d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1b4e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1b4f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1b500 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1b510 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b520 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
1b530 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1b540 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1b550 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1b560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1b570 63 68 65 50 72 65 73 65 72 76 65 28 70 50 67 2c  chePreserve(pPg,
1b580 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1b590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b5b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b5e0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
1b5f0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1b600 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  2;..          /*
1b610 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
1b620 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
1b630 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
1b640 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age 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 20 20 2a 2a 20 74  s.          ** t
1b6a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
1b6b0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
1b6c0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
1b6d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1b6e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
1b6f0 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
1b700 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1b710 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
1b720 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
1b730 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
1b740 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
1b750 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  2);.          rc
1b760 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1b770 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1b780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1b790 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1b7a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b7c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b7d0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1b7e0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1b7f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b830 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
1b840 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b850 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
1b860 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
1b870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b880 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1b8b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1b8c0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
1b8d0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
1b8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
1b8f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b900 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
1b910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54   }.          IOT
1b920 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
1b930 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
1b940 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
1b950 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b970 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
1b980 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
1b990 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
1b9a0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1b9b0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
1b9c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1b9d0 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE5("JOURNAL %d
1b9e0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1b9f0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
1ba00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ba10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1ba20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ba40 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1ba50 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
1ba60 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
1ba70 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
1ba80 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
1ba90 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
1baa0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
1bab0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
1bac0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1bad0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
1bae0 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
1baf0 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
1bb00 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1bb10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bb20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bb30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1bb50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1bb60 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1bb70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bb80 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1bb90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
1bba0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
1bbb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1bbc0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
1bbd0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1bbe0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d              pPg-
1bc00 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1bc10 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
1bc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1bc30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1bc40 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1bc50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
1bc60 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1bc70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e  InStmt, pPg->pgn
1bc80 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
1bc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1bcb0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1bcc0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
1bcd0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1bce0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1bcf0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1bd00 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1bd10 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1bd20 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1bd30 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1bd40 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1bd50 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1bd60 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1bd70 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
1bd80 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
1bd90 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1bda0 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20 20 20 20  NC)?1:0));.     
1bdb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1bdc0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1bdd0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1bde0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1bdf0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1be00 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1be10 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  s |= PGHDR_IN_JO
1be20 55 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 0a  URNAL;.    }.  .
1be30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1be40 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1be50 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1be60 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1be70 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1be80 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1be90 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1bea0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1beb0 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1bec0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1bed0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1bee0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1bef0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1bf00 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1bf10 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1bf20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1bf30 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1bf40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1bf50 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
1bf60 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53       && !pageInS
1bf70 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
1bf80 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d      && (int)pPg-
1bf90 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1bfa0 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a  tmtSize .    ){.
1bfb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1bfc0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1bfd0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 0a 20 20 20  IN_JOURNAL) .   
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
1bff0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1c000 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1c010 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1c020 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1c030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1c040 63 68 65 50 72 65 73 65 72 76 65 28 70 50 67 2c  chePreserve(pPg,
1c050 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
1c060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c070 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c080 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1c090 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1c0a0 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1c0b0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1c0c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c0d0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1c0e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c0f0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1c100 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1c110 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
1c120 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1c130 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1c140 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1c150 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1c160 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  7);.        rc =
1c170 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1c180 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65  ger->stfd, offse
1c190 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
1c1a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c1b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c1c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c1d0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c1e0 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1c1f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c200 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
1c210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
1c220 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1c230 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1c240 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c250 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1c260 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1c270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c280 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c290 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1c2a0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c2b0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1c2c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c2d0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20  ger->pInStmt!=0 
1c2e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c2f0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1c300 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1c310 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
1c320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c330 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
1c340 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
1c350 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
1c360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c370 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1c380 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1c390 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
1c3a0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
1c3b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c3c0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
1c3d0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
1c3e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
1c3f0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
1c400 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1c410 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c420 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
1c430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c440 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c450 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ion is used to m
1c460 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20  ark a data-page 
1c470 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20  as writable. It 
1c480 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77  uses .** pager_w
1c490 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61  rite() to open a
1c4a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
1c4b0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1c4c0 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64  ady open).** and
1c4d0 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20   write the page 
1c4e0 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f  *pData to the jo
1c4f0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
1c500 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1c510 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
1c520 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
1c530 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
1c540 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
1c550 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
1c560 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
1c570 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
1c580 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
1c590 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
1c5a0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
1c5b0 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
1c5c0 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
1c5d0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1c5e0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1c5f0 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
1c600 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
1c610 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c620 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
1c630 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c640 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
1c650 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
1c660 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c670 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1c680 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
1c690 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
1c6a0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
1c6b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
1c6c0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1c6d0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
1c6e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
1c6f0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
1c700 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1c710 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1c720 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1c730 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c750 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
1c760 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1c770 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
1c780 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1c7b0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
1c7c0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1c7d0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
1c7e0 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
1c7f0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1c800 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
1c810 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
1c820 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
1c830 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
1c840 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
1c850 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
1c860 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
1c870 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
1c880 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
1c890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c8a0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1c8b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1c8c0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1c8d0 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1c8e0 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1c8f0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1c900 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1c910 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1c920 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1c930 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1c940 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1c950 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1c960 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1c970 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1c980 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1c990 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1c9a0 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1c9b0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1c9c0 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1c9d0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
1c9e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1c9f0 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
1ca00 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
1ca10 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1ca20 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1ca30 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1ca40 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1ca50 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1ca60 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1ca70 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1ca80 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1ca90 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1caa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cab0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1cac0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1cad0 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1cae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1caf0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1cb00 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1cb10 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1cb20 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1cb30 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1cb40 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1cb50 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1cb60 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1cb70 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
1cb80 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
1cb90 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
1cba0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1cbb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1cbc0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
1cbd0 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1cbe0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1cbf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1cc00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1cc10 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
1cc20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1cc30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cc40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cc50 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1cc60 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1cc70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1cc80 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1cc90 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
1cca0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
1ccb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
1ccc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
1ccd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cce0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1ccf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1cd00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1cd10 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
1cd20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
1cd30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1cd40 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
1cd50 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1cd60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1cd70 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1cd80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1cd90 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1cda0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
1cdb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1cdc0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1cdd0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1cde0 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
1cdf0 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
1ce00 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
1ce10 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
1ce20 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
1ce30 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
1ce40 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
1ce50 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
1ce60 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
1ce70 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
1ce80 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
1ce90 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
1cea0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
1ceb0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
1cec0 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
1ced0 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
1cee0 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
1cef0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1cf00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1cf10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
1cf20 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66  dSync ){.      f
1cf30 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1cf40 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
1cf50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
1cf60 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
1cf70 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1cf80 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
1cf90 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
1cfa0 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
1cfb0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1cfc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1cfd0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1cfe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cff0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1d000 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
1d010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d020 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1d030 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1d040 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1d050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1d060 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1d070 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1d080 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d090 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1d0a0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1d0b0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1d0c0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1d0d0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1d0e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1d0f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1d100 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1d110 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1d120 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1d130 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1d140 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1d150 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1d160 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1d170 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1d180 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
1d190 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
1d1a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1d1b0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1d1c0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1d1d0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1d1e0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1d1f0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1d200 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1d210 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
1d220 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1d230 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1d240 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1d250 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1d260 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1d270 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1d280 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1d290 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1d2a0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1d2b0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1d2c0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1d2d0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1d2e0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1d2f0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1d300 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1d310 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1d320 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1d330 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1d340 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1d350 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1d360 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1d370 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1d380 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1d390 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1d3a0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1d3b0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1d3c0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1d3d0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1d3e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d3f0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1d400 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1d410 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1d420 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1d430 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1d440 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d450 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1d460 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1d470 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1d480 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d490 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1d4a0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1d4b0 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1d4c0 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1d4d0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d4e0 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1d4f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1d500 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1d510 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1d520 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1d530 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1d540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1d550 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1d560 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1d570 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1d580 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1d590 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1d5a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d5b0 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1d5c0 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1d5d0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1d5e0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1d5f0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1d600 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1d610 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1d620 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1d630 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1d640 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1d650 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1d660 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1d670 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d680 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  () call..*/.int 
1d690 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d6a0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1d6b0 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
1d6c0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1d6d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d6e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1d6f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1d700 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 70 67  MEMDB || pPg->pg
1d710 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1d720 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
1d730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d740 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1d750 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1d760 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1d770 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1d780 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1d790 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
1d7a0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 42 69  back = sqlite3Bi
1d7b0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
1d7c0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a  r->origDbSize);.
1d7d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1d7e0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1d7f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d810 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
1d820 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1d830 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
1d840 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
1d850 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  gno);..  if( rc=
1d860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
1d870 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d880 44 49 52 54 59 29 20 26 26 20 21 70 50 61 67 65  DIRTY) && !pPage
1d890 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1d8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d8b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1d8c0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1d8d0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d8e0 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1d8f0 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1d900 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1d910 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1d920 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1d930 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1d940 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1d950 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1d960 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1d970 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1d980 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1d990 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1d9a0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1d9b0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1d9c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d9d0 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1d9e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1d9f0 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1da00 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1da10 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1da20 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1da30 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1da40 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1da50 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1da60 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1da70 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1da80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1da90 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1daa0 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1dab0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1dac0 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1dad0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1dae0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1daf0 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1db00 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1db10 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1db20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1db30 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1db40 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1db50 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1db60 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1db70 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
1db80 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1db90 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1dba0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
1dbb0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
1dbc0 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  RITE;.#ifdef SQL
1dbd0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1dbe0 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1dbf0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1dc00 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1dc10 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  f.    }.  }.  re
1dc20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dc30 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1dc40 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1dc50 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1dc60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1dc70 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1dc80 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1dc90 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1dca0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1dcb0 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1dcc0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1dcd0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1dce0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1dcf0 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1dd00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1dd10 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
1dd20 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
1dd30 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
1dd40 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
1dd50 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
1dd60 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1dd70 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
1dd80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
1dd90 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
1dda0 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
1ddb0 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
1ddc0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1ddd0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1dde0 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
1ddf0 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
1de00 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
1de10 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
1de20 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1de30 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
1de40 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1de50 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1de60 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ger;..  assert( 
1de70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1de80 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1de90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
1dea0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1deb0 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57  t open, or DontW
1dec0 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20  rite() has been 
1ded0 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74  called on.  ** t
1dee0 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72  his page (DontWr
1def0 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20 61  ite() sets the a
1df00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1df10 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20  ag), then this. 
1df20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
1df30 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1df40 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1df50 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c  nalOpen==0 .   |
1df60 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
1df70 65 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  est(pPager->pAlw
1df80 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67  aysRollback, pPg
1df90 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50  ->pgno).   || pP
1dfa0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1dfb0 6f 72 69 67 44 62 53 69 7a 65 0a 20 20 29 7b 0a  origDbSize.  ){.
1dfc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1dfd0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1dfe0 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20   );    /* For a 
1dff0 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a  memdb, pPager->j
1e000 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c  ournalOpen is al
1e010 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65  ways 0 */..#ifde
1e020 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1e030 44 45 4c 45 54 45 0a 20 20 69 66 28 20 28 70 50  DELETE.  if( (pP
1e040 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
1e050 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 21 3d 30 20  _IN_JOURNAL)!=0 
1e060 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1e070 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1e080 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
1e090 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
1e0a0 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44    /* If SECURE_D
1e0b0 45 4c 45 54 45 20 69 73 20 64 69 73 61 62 6c 65  ELETE is disable
1e0c0 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
1e0d0 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 69   no way that thi
1e0e0 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63  s.  ** routine c
1e0f0 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  an be called on 
1e100 61 20 70 61 67 65 20 66 6f 72 20 77 68 69 63 68  a page for which
1e110 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e120 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61  tWrite().  ** ha
1e130 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
1e140 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72  ously called dur
1e150 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 72 61  ing the same tra
1e160 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  nsaction..  ** A
1e170 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28  nd if DontWrite(
1e180 29 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) has previously
1e190 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1e1a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1e1b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
1e1c0 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20   be met..  **.  
1e1d0 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e 6f 74  ** (Later:)  Not
1e1e0 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 20 64   true.  If the d
1e1f0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
1e200 70 74 65 64 20 62 79 20 68 61 76 69 6e 67 20 64  pted by having d
1e210 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20 70 61  uplicate.  ** pa
1e220 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e230 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75 70 74  ist (ex: corrupt
1e240 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74 68 65  9.test) then the
1e250 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f   following is no
1e260 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69  t.  ** necessari
1e270 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a 20 20  ly true:.  */.  
1e280 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  /* assert( !pPg-
1e290 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1e2a0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1e2b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1e2c0 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65  ze ); */..  asse
1e2d0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1e2e0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
1e2f0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
1e300 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1e310 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
1e320 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1e330 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
1e340 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  ;.  pPg->flags &
1e350 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
1e360 41 44 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  AD;.  if( pPager
1e370 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1e380 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e390 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70  r->stmtSize >= p
1e3a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1e3b0 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
1e3c0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1e3d0 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
1e3e0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47  pgno);.  }.  PAG
1e3f0 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52  ERTRACE3("DONT_R
1e400 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
1e410 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1e420 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1e430 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
1e440 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64  (("GARBAGE %p %d
1e450 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1e460 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a  ->pgno)).}.../*.
1e470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e480 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1e490 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1e4a0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1e4b0 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1e4c0 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1e4d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1e4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e4f0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1e500 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1e510 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
1e520 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ect){.  PgHdr *p
1e530 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
1e540 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
1e550 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e560 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  K;..#ifndef SQLI
1e570 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1e580 5f 57 52 49 54 45 0a 20 20 61 73 73 65 72 74 28  _WRITE.  assert(
1e590 20 69 73 44 69 72 65 63 74 3d 3d 30 20 29 3b 20   isDirect==0 ); 
1e5a0 20 2f 2a 20 69 73 44 69 72 65 63 74 20 69 73 20   /* isDirect is 
1e5b0 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 61 74  only true for at
1e5c0 6f 6d 69 63 20 77 72 69 74 65 73 20 2a 2f 0a 23  omic writes */.#
1e5d0 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 61  endif.  if( !pPa
1e5e0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1e5f0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
1e600 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1e610 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1e620 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
1e630 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1e640 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
1e650 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1e660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1e670 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
1e680 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
1e690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6a0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
1e6b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1e6c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1e6e0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1e6f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e700 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1e710 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
1e720 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1e730 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1e740 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1e750 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
1e760 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
1e770 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
1e780 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
1e790 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
1e7a0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1e7b0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
1e7c0 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
1e7d0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1e7e0 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66  ounter);..#ifdef
1e7f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1e800 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
1e810 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20  if( isDirect && 
1e820 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1e830 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  hods ){.      co
1e840 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
1e850 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
1e860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e870 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1e880 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
1e890 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
1e8a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1e8b0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
1e8c0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1e8d0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1e8e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1e8f0 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
1e900 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1e910 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
1e920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e930 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
1e940 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ile to disk..*/.
1e950 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e960 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
1e970 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1e980 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1e990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1e9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1e9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1e9c0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1e9d0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1e9e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e9f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
1ea00 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ea10 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1ea20 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1ea30 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1ea40 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1ea50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ea60 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1ea70 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ea80 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1ea90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1eaa0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1eab0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1eac0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1ead0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1eae0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1eaf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1eb00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1eb10 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1eb20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1eb30 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1eb40 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1eb50 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1eb60 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1eb70 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1eb80 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1eb90 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1eba0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1ebb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1ebc0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1ebd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1ebe0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1ebf0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1ec00 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1ec10 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1ec20 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1ec30 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1ec40 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1ec50 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1ec60 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ec70 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
1ec80 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1ec90 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1eca0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1ecb0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1ecc0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1ecd0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1ece0 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1ecf0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1ed00 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  bases)..**.** If
1ed10 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
1ed20 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
1ed30 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1ed40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ed50 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
1ed60 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
1ed70 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
1ed80 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
1ed90 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
1eda0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1edb0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
1edc0 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
1edd0 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
1ede0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1edf0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1ee00 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1ee10 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1ee20 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
1ee30 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  Pager, .  const 
1ee40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a  char *zMaster, .
1ee50 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20    Pgno nTrunc,. 
1ee60 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20   int noSync.){. 
1ee70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ee80 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
1ee90 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1eea0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1eeb0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
1eec0 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67    /* If no chang
1eed0 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
1eee0 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20  e, we can leave 
1eef0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ef00 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  early..  */.  if
1ef10 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  ( pPager->dbModi
1ef20 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20  fied==0 &&.     
1ef30 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72     (pPager->jour
1ef40 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
1ef50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
1ef60 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
1ef70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1ef80 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20  Mode!=0) ){.    
1ef90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1efa0 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
1efb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1efc0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Open==0 );.    r
1efd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1efe0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
1eff0 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
1f000 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
1f010 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
1f020 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
1f030 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f040 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
1f050 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f060 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1f070 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
1f080 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1f090 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
1f0a0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
1f0b0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1f0c0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
1f0d0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
1f0e0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1f0f0 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
1f100 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1f110 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
1f120 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69   PgHdr *pPg;..#i
1f130 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f140 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1f150 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
1f160 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
1f170 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
1f180 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
1f190 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
1f1a0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
1f1b0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f1c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
1f1d0 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
1f1e0 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
1f1f0 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
1f200 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
1f210 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
1f220 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
1f230 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
1f240 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
1f250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
1f260 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
1f270 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
1f280 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1f290 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
1f2a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1f2b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f2c0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
1f2d0 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
1f2e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1f2f0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
1f300 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
1f310 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
1f320 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
1f330 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1f340 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f350 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f360 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  );.    int useAt
1f370 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
1f380 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
1f390 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
1f3a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1f3b0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1f3c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
1f3d0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
1f3e0 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
1f3f0 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20   nTrunc==0 && . 
1f400 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20 7c         (pPg==0 |
1f410 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d 30  | pPg->pDirty==0
1f420 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
1f430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1f440 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1f450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1f460 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1f470 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
1f480 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
1f490 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
1f4a0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
1f4b0 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
1f4c0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
1f4d0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
1f4e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f4f0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
1f500 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
1f510 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1f520 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
1f530 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1f540 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
1f550 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
1f560 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
1f570 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
1f580 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
1f590 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1f5a0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
1f5b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
1f5c0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
1f5d0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
1f5e0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
1f5f0 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
1f600 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
1f610 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
1f620 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
1f630 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1f640 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
1f650 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
1f660 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
1f670 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
1f680 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
1f690 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
1f6a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1f6b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f6c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f6d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1f6e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1f6f0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
1f700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
1f720 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
1f730 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
1f740 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
1f750 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
1f760 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
1f770 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
1f780 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f790 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1f7a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f7b0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1f7c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1f7d0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1f7e0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1f7f0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1f800 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1f810 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1f820 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1f830 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1f840 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1f850 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1f860 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1f870 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1f880 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1f890 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f8a0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1f8b0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1f8c0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1f8d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1f8e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1f8f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1f900 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1f910 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
1f920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f930 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f940 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1f960 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1f970 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
1f980 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1f990 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1f9a0 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  UM.        if( n
1f9b0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1f9c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1f9d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1f9e0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1f9f0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1fa00 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1fa10 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1fa20 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1fa30 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1fa40 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1fa50 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1fa60 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1fa70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1fa80 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1fa90 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
1faa0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
1fab0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1fac0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1fad0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1fae0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1faf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fb00 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
1fb10 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1fb20 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
1fb30 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1fb40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fb50 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1fb60 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1fb80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb90 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1fbb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fbc0 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1fbd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fbe0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1fbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fc00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc10 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fc20 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1fc30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a 20  }.          } . 
1fc40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1fc50 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1fc60 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1fc70 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1fc80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1fc90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1fca0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1fcb0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1fcc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1fcd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fce0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fcf0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fd00 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
1fd10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fd20 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1fd30 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1fd40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fd50 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1fd60 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1fd70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fd80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fd90 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1fda0 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1fdb0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1fdc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fdd0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1fde0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fdf0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1fe00 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1fe10 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1fe20 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1fe30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
1fe50 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1fe60 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
1fe70 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
1fe80 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65  error might have
1fe90 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20   left the dirty 
1fea0 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20  list all fouled 
1feb0 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a  up here,.      *
1fec0 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  * but that does 
1fed0 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
1fee0 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65  se if the if the
1fef0 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a   dirty list did.
1ff00 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72        ** get cor
1ff10 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65  rupted, then the
1ff20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1ff30 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a  l roll back and.
1ff40 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64        ** discard
1ff50 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e   the dirty list.
1ff60 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73    There is an as
1ff70 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sert in.      **
1ff80 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1ff90 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61  irty_pages() tha
1ffa0 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
1ffb0 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20  no attempt.     
1ffc0 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75   ** is made to u
1ffd0 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69  se an invalid di
1ffe0 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  rty list..      
1fff0 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79  */.      goto sy
20000 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nc_exit;.    }. 
20010 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
20020 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
20030 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20  >pPCache);..    
20040 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
20050 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
20060 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
20070 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
20080 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20090 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
200a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
200b0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
200c0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
200d0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
200e0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
200f0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
20100 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
20110 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
20120 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
20130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20140 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
20150 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
20160 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
20170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
20180 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
20190 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
201a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
201b0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
201c0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
201d0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
201e0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
201f0 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
20200 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
20210 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
20220 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
20230 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
20240 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
20250 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
20260 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
20270 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
20280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20290 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
202a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
202b0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
202c0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
202d0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
202e0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
202f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
20300 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
20310 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
20320 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
20330 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
20340 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20350 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
20360 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
20370 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
20380 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
20390 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
203a0 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
203b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
203c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
203d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
203e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
203f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
20400 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
20410 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
20420 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
20430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20440 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
20450 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
20460 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
20470 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
20480 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
20490 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
204a0 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
204b0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
204c0 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
204d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
204e0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
204f0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20500 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
20510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20520 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
20530 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
20540 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20550 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
20560 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
20570 63 61 63 68 65 43 6f 6d 6d 69 74 28 70 50 61 67  cacheCommit(pPag
20580 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 29 3b  er->pPCache, 0);
20590 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
205a0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
205b0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
205c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
205d0 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  tFlags(pPager->p
205e0 50 43 61 63 68 65 2c 20 0a 20 20 20 20 20 20 20  PCache, .       
205f0 7e 28 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  ~(PGHDR_IN_JOURN
20600 41 4c 20 7c 20 50 47 48 44 52 5f 4e 45 45 44 5f  AL | PGHDR_NEED_
20610 53 59 4e 43 29 2c 20 30 0a 20 20 20 20 29 3b 0a  SYNC), 0.    );.
20620 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20630 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
20640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
20650 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20660 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
20670 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  ED || !pPager->d
20680 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 20  irtyCache );.   
20690 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
206a0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
206b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
206c0 61 73 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  aster);.    rc =
206d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
206e0 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
206f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20700 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
20710 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
20720 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
20730 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
20740 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
20750 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
20760 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
20770 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
20780 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
20790 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
207a0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
207b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
207c0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
207d0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
207e0 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
207f0 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
20800 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
20810 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
20820 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
20830 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
20840 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
20850 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
20860 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
20870 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
20880 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
20890 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
208a0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
208b0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
208c0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
208d0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
208e0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
208f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20900 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
20910 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20920 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
20930 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20940 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45  QLITE_OK;.  PAGE
20950 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
20960 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
20970 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20980 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71   MEMDB ){.    sq
20990 6c 69 74 65 33 50 63 61 63 68 65 52 6f 6c 6c 62  lite3PcacheRollb
209a0 61 63 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ack(pPager->pPCa
209b0 63 68 65 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  che, 1);.    sql
209c0 69 74 65 33 50 63 61 63 68 65 52 6f 6c 6c 62 61  ite3PcacheRollba
209d0 63 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ck(pPager->pPCac
209e0 68 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  he, 0);.    sqli
209f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
20a00 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
20a10 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  e);.    sqlite3P
20a20 63 61 63 68 65 53 65 74 46 6c 61 67 73 28 70 50  cacheSetFlags(pP
20a30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 0a  ager->pPCache, .
20a40 20 20 20 20 20 20 20 7e 28 50 47 48 44 52 5f 49         ~(PGHDR_I
20a50 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47 48 44  N_JOURNAL | PGHD
20a60 52 5f 4e 45 45 44 5f 53 59 4e 43 29 2c 20 30 0a  R_NEED_SYNC), 0.
20a70 20 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65      );.    pPage
20a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
20a90 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
20aa0 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
20ab0 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
20ac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20ad0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
20ae0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20af0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
20b00 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
20b10 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
20b20 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
20b30 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
20b40 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20b50 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
20b60 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
20b70 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  er);.  }else if(
20b80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20b90 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
20ba0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
20bb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
20bc0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
20bd0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
20be0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
20bf0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
20c00 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50     }.    rc = pP
20c10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
20c30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20c40 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
20c50 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
20c60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20c70 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
20c80 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20  , 0);.      rc2 
20c90 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
20ca0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
20cb0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
20cc0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
20cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20ce0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
20cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20d00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
20d10 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
20d20 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
20d30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
20d40 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f  ize = -1;..    /
20d50 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20d60 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
20d70 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
20d80 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
20d90 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
20da0 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
20db0 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
20dc0 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
20dd0 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
20de0 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
20df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
20e00 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
20e10 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
20e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20e30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
20e40 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20e50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
20e60 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
20e70 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
20e80 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
20e90 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
20ea0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
20eb0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
20ec0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
20ed0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
20ee0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
20ef0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
20f10 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
20f20 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
20f30 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
20f40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20f50 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20f60 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
20f70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20f80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
20f90 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
20fa0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
20fb0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
20fc0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
20fd0 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
20fe0 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
20ff0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
21000 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
21010 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33    a[0] = sqlite3
21020 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
21030 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21040 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65  .  a[1] = sqlite
21050 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
21060 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21070 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69  );.  a[2] = sqli
21080 74 65 33 50 63 61 63 68 65 47 65 74 43 61 63 68  te3PcacheGetCach
21090 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
210a0 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d  Cache);.  a[3] =
210b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
210c0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
210d0 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
210e0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
210f0 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
21100 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
21110 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
21120 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
21130 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
21140 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
21150 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
21160 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
21170 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
21180 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e    return a;.}.in
21190 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
211a0 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61  Memdb(Pager *pPa
211b0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d  ger){.  return M
211c0 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  EMDB;.}.#endif..
211d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
211e0 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
211f0 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
21200 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
21210 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
21220 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21230 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
21240 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
21250 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
21260 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
21270 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
21280 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
21290 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
212a0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
212b0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
212c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
212d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
212e0 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
212f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
21300 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
21310 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
21320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21330 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
21340 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
21350 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
21360 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45  ize>=0 );.  PAGE
21370 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45  RTRACE2("STMT-BE
21380 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
21390 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
213a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
213b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
213c0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
213d0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
213e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
213f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21400 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
21410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21420 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
21430 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
21440 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
21450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21460 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21470 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
21480 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21490 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  >pInStmt==0 );. 
214a0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
214b0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
214c0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
214d0 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
214e0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30  ager->pInStmt==0
214f0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
21500 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21510 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
21520 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
21530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21540 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21550 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
21560 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
21570 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21580 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
215a0 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
215b0 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
215c0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
215d0 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
215e0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
215f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21600 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
21610 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
21620 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
21630 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
21640 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21650 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
21660 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
21670 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
21680 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
21690 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
216a0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
216b0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
216c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
216d0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
216e0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
216f0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29  Pager->pInStmt )
21700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
21710 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
21720 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
21730 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
21740 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
21750 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
21760 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
21770 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
21780 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
21790 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67  c = pagerStmtBeg
217a0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  in(pPager);.  re
217b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
217c0 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
217d0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
217e0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
217f0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21800 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
21810 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
21820 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
21830 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
21840 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21850 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
21860 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
21870 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
21880 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
21890 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
218a0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
218b0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
218c0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
218d0 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
218e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6f 6d  sqlite3PcacheCom
21900 6d 69 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  mit(pPager->pPCa
21910 63 68 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  che, 1);.    }. 
21920 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
21930 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
21940 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
21950 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
21960 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
21970 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
21980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21990 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
219a0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
219b0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
219c0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
219d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
219e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
219f0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21a00 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
21a10 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
21a20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21a30 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
21a40 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
21a50 65 33 50 63 61 63 68 65 52 6f 6c 6c 62 61 63 6b  e3PcacheRollback
21a60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21a70 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 1);.      pPag
21a80 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
21a90 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
21aa0 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
21ab0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
21ac0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
21ad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
21ae0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
21af0 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
21b00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
21b10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21b20 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
21b30 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
21b40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21b50 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
21b60 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21b70 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
21b80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21b90 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
21ba0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21bb0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
21bc0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21bd0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
21be0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21bf0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
21c00 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
21c10 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
21c20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
21c30 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
21c40 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
21c50 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
21c60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21c70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21c80 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
21c90 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
21ca0 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
21cb0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
21cc0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
21cd0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
21ce0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
21cf0 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
21d00 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
21d10 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
21d20 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
21d30 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
21d40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21d50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
21d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21d70 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
21d80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21d90 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
21da0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
21db0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
21dc0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21dd0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
21de0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
21df0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
21e00 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
21e10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
21e20 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21e30 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
21e40 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21e60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
21e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
21e80 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
21e90 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
21ea0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
21eb0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
21ec0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
21ed0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
21ee0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
21ef0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
21f00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21f10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21f20 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
21f30 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
21f40 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
21f50 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
21f60 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
21f70 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
21f80 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
21f90 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
21fa0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
21fb0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
21fc0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
21fd0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
21fe0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
21ff0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
22000 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
22010 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
22020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22030 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
22040 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20  ve the page pPg 
22050 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
22060 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   in the file..**
22070 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
22080 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
22090 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76  to the page prev
220a0 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
220b0 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68  t.** pgno (which
220c0 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29   we call pPgOld)
220d0 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67   though that pag
220e0 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
220f0 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20  be.** in cache. 
22100 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65   If the page pre
22110 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74  vious located at
22120 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
22130 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
22140 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
22150 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
22160 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
22170 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
22180 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
22190 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
221a0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
221b0 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
221c0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
221d0 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
221e0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
221f0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
22200 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
22210 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
22220 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
22230 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
22240 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
22250 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
22260 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
22270 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
22280 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
22290 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
222a0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
222b0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
222c0 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
222d0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
222e0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
222f0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
22300 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
22310 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
22320 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
22330 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
22340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
22350 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
22360 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
22370 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
22380 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
22390 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
223a0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
223b0 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
223c0 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
223d0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
223e0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
223f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
22400 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22410 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22420 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
22430 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
22440 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
22450 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
22460 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
22470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22480 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
22490 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
224a0 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
224b0 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b  , int isCommit){
224c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
224d0 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
224e0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
224f0 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
22500 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
22510 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
22520 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52  ef>0 );..  PAGER
22530 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
22540 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
22550 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
22560 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
22570 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22580 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
22590 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
225a0 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
225b0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
225c0 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
225d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
225e0 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
225f0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
22600 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
22610 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
22620 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
22630 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
22640 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
22650 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
22660 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
22670 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
22680 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
22690 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
226a0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
226b0 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
226c0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
226d0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
226e0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
226f0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
22700 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
22710 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
22720 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
22730 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
22740 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
22750 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
22760 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
22770 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
22780 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
22790 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
227a0 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
227b0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
227c0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
227d0 66 6c 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a  flags&PGHDR_IN_J
227e0 4f 55 52 4e 41 4c 29 20 7c 7c 20 28 69 6e 74 29  OURNAL) || (int)
227f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
22800 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
22810 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
22820 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
22830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22840 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
22850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
22860 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
22870 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
22880 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
22890 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
228a0 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
228b0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
228c0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
228d0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
228e0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
228f0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
22900 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
22910 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
22920 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
22930 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
22940 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
22950 73 20 26 3d 20 7e 28 50 47 48 44 52 5f 4e 45 45  s &= ~(PGHDR_NEE
22960 44 5f 53 59 4e 43 7c 50 47 48 44 52 5f 49 4e 5f  D_SYNC|PGHDR_IN_
22970 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 70 50 67 4f  JOURNAL);.  pPgO
22980 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
22990 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
229a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
229b0 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
229c0 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
229d0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
229e0 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
229f0 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
22a00 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a  NEED_SYNC);.  }.
22a10 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 69 74    if( sqlite3Bit
22a20 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
22a30 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
22a40 29 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  ) ){.    pPg->fl
22a50 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f  ags |= PGHDR_IN_
22a60 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20  JOURNAL;.  }..  
22a70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
22a80 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  e(pPg, pgno);.  
22a90 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
22aa0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22ab0 6f 76 65 28 70 50 67 4f 6c 64 2c 20 30 29 3b 0a  ove(pPgOld, 0);.
22ac0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22ad0 65 52 65 6c 65 61 73 65 28 70 50 67 4f 6c 64 29  eRelease(pPgOld)
22ae0 3b 0a 20 20 7d 0a 0a 20 20 6d 61 6b 65 44 69 72  ;.  }..  makeDir
22af0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
22b00 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
22b10 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  1;.  pPager->dbM
22b20 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
22b30 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
22b40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
22b50 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
22b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
22b70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
22b80 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
22b90 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
22ba0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
22bb0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
22bc0 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
22bd0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
22be0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
22bf0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
22c00 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
22c10 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
22c20 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
22c30 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
22c40 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
22c50 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
22c60 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
22c70 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
22c80 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
22c90 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
22ca0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
22cb0 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
22cc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22cd0 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
22ce0 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
22cf0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
22d00 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
22d10 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
22d20 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
22d30 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
22d40 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
22d50 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
22d60 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
22d70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
22d80 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
22d90 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
22da0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
22db0 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
22dc0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
22dd0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
22de0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
22df0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
22e00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
22e10 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
22e20 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
22e30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22e40 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
22e50 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
22e60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22e70 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
22e80 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
22e90 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
22ea0 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
22eb0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
22ec0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
22ed0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
22ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
22ef0 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   rc;.    PgHdr *
22f00 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
22f10 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
22f20 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
22f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22f40 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
22f50 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
22f60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22f80 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
22f90 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e  ournal && (int)n
22fa0 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
22fb0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
22fc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22fd0 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
22fe0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
22ff0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b  , needSyncPgno);
23000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
23010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23020 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
23030 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
23040 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  gHdr->flags |= P
23050 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
23060 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
23070 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  s |= PGHDR_IN_JO
23080 55 52 4e 41 4c 3b 0a 20 20 20 20 6d 61 6b 65 44  URNAL;.    makeD
23090 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
230a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
230b0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
230c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
230d0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
230e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
230f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
23100 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
23110 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
23120 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
23130 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
23140 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
23150 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
23160 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
23170 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
23180 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23190 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
231a0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
231b0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
231c0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
231d0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
231e0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
231f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
23200 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
23210 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
23220 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23230 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
23240 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29  r?pPg->pExtra:0)
23250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
23260 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
23270 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
23280 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
23290 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
232a0 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
232b0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
232c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
232d0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
232e0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
232f0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
23300 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
23310 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
23320 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
23330 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
23340 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
23350 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
23360 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
23370 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
23380 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
23390 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
233a0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
233b0 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
233c0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
233d0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
233e0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
233f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23400 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
23410 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23420 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
23430 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
23440 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
23450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
23460 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
23470 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
23480 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
23490 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
234a0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
234b0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
234c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
234d0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
234e0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
234f0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
23500 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
23510 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23520 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
23530 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
23540 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
23550 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
23560 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
23570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
23580 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
23590 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  siveMode;.}../*.
235a0 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a  ** Get/set the j
235b0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20  ournal-mode for 
235c0 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
235d0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
235e0 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
235f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23600 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f 55  QUERY, PAGER_JOU
23610 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
23620 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  or .** PAGER_JOU
23630 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
23640 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
23650 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
23660 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f  , then.** the jo
23670 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65  urnal-mode is se
23680 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
23690 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
236a0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
236b0 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
236c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
236d0 45 4c 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47 45  ELETE or.** PAGE
236e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
236f0 52 53 49 53 54 2c 20 69 6e 64 69 63 61 74 69 6e  RSIST, indicatin
23700 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
23710 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
23720 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  .** journal-mode
23730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23740 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
23750 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23760 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
23770 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
23780 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
23790 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
237a0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
237b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
237c0 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ETE.            
237d0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
237e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
237f0 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  IST.            
23800 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
23810 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
23820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
23830 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
23840 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
23850 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
23860 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30 20  LMODE_DELETE>=0 
23870 26 26 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  && PAGER_JOURNAL
23880 4d 4f 44 45 5f 50 45 52 53 49 53 54 3e 3d 30 20  MODE_PERSIST>=0 
23890 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
238a0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
238b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65  >journalMode = e
238c0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
238d0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
238e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a  journalMode;.}..
238f0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
23900 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65  e size-limit use
23910 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  d for persistent
23920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
23930 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61  */.i64 sqlite3Pa
23940 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  gerJournalSizeLi
23950 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
23960 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a  r, i64 iLimit){.
23970 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31    if( iLimit>=-1
23980 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23990 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
239a0 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   = iLimit;.  }. 
239b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
239c0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
239d0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
239e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
239f0 4f 20 2a 2f 0a                                   O */.