/ Hex Artifact Content
Login

Artifact 34318b85cead25e179a6ff83092c79d6dcecb2fd:


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 39  : pager.c,v 1.49
0350: 31 20 32 30 30 38 2f 30 39 2f 31 37 20 32 30 3a  1 2008/09/17 20:
0360: 30 36 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a  06:26 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
03f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0400: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0410: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0430: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0440: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0450: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0460: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
0470: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0480: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
0490: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04a0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04b0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04c0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
04d0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
04e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04f0: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0500: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0510: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0520: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0530: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0540: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0550: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0560: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
0590: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05a0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05c0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
05d0: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
05e0: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
05f0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0600: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0610: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0620: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0630: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0640: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0650: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0660: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
0670: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
0680: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
0690: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06a0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06b0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06c0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
06d0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06e0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
06f0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0700: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0710: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0720: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0730: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0740: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0750: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0760: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0770: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0780: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0790: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07a0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07b0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07e0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
07f0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0810: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0820: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0830: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0860: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0870: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0880: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0890: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08c0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08d0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0900: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0910: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0920: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0930: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0940: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0960: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0970: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0980: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
0990: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09b0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09c0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09d0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09e0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a10: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a20: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a30: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a70: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a90: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0aa0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ab0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ac0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0ae0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0af0: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b00: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b10: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b40: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b50: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b60: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b70: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0b90: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0ba0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bb0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0be0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0bf0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c00: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c10: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c20: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c30: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c50: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c60: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c70: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0ca0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cb0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0ce0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0cf0: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d00: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0d70: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0d80: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0d90: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0da0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0db0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0dc0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0dd0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0de0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0df0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e00: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e10: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e20: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e30: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e40: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e50: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e60: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0e70: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0e80: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0e90: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ea0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0eb0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ec0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ed0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0ee0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ef0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f00: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f10: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f20: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f30: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f40: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f50: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f60: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0f70: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0f80: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0f90: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fa0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fb0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0fc0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
0fd0: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
0fe0: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
0ff0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1000: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1020: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1030: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1040: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1050: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1060: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
1070: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
1080: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
1090: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10a0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10b0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10c0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
10d0: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
10e0: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
10f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1100: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1110: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1120: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1130: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1140: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1150: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1160: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
1170: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
1180: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
1190: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11a0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11c0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
11d0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
11e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
11f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1200: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1210: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1220: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1230: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1240: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1250: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1260: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1270: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
1280: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
1290: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12a0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12b0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12c0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
12d0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12e0: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
12f0: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1300: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1310: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1320: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1330: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1340: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1350: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1360: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1370: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1380: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
1390: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13a0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13b0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13c0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
13d0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13e0: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
13f0: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1400: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1410: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1420: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1430: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1440: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1450: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1460: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
1470: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
1480: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
1490: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14a0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14b0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
14d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
14e0: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
14f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1510: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1520: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1530: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1540: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1550: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1560: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
1570: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
1580: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
1590: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15a0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15b0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15c0: 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  )&~7)../*.** A m
15d0: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
15e0: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
15f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1600: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1610: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1620: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1630: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1640: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1650: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1660: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
1670: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
1680: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
1690: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
16a0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
16b0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
16d0: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
16e0: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
16f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1700: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1710: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1720: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1730: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1740: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1750: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
1760: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
1770: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
1780: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
1790: 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51  UPT, or.** or SQ
17a0: 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20  LITE_FULL. Once 
17b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  one of the first
17c0: 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63   three errors oc
17d0: 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74  curs, it persist
17e0: 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75  s.** and is retu
17f0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
1800: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
1810: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
1820: 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
1830: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
1840: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
1850: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
1860: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
1870: 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63  the.** next succ
1880: 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20  essful rollback 
1890: 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  is performed on 
18a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
18b0: 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45   Also,.** SQLITE
18c0: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
18d0: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
18e0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
18f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1900: 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68  up().** APIs, th
1910: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
1920: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
1930: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  y..*/.struct Pag
1940: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
1950: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
1960: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
1970: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
1980: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1990: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
19a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
19b0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19c0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
19d0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
19e0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
19f0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
1a00: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
1a10: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
1a20: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
1a40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a50: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
1a60: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
1a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a80: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1a90: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
1aa0: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
1ab0: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
1ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ad0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1ae0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
1af0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
1b00: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
1b10: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
1b20: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
1b30: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
1b50: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
1b60: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
1b70: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
1b80: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
1b90: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
1bc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
1bd0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
1be0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
1bf0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
1c00: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
1c10: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
1c20: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
1c30: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
1c40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1c50: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
1c60: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
1c70: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
1c90: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
1ca0: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
1cb0: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
1cc0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
1cd0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1ce0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
1cf0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
1d00: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d20: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
1d30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
1d40: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d60: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
1d70: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
1d80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1d90: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1db0: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
1dc0: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
1dd0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1de0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1df0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
1e00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
1e10: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
1e20: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
1e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e40: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
1e50: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
1e60: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
1e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e80: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
1e90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1ea0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
1eb0: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1ed0: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
1ee0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
1ef0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
1f00: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1f20: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
1f40: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
1f50: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
1f60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
1f70: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
1f80: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
1f90: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
1fa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1fb0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
1fc0: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
1fd0: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
1fe0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
1ff0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
2000: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
2010: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
2020: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
2030: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
2040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2050: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
2060: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2070: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2090: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
20a0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
20b0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20e0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
20f0: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2110: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2120: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2130: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2140: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2150: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2160: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2170: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2180: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21b0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
21c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
21d0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
21e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21f0: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2200: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2210: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2220: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2240: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2250: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2260: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2270: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2280: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2290: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
22a0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
22b0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
22c0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
22d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
22f0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2300: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2310: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2320: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2330: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2340: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2350: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2360: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2370: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2380: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
2390: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
23a0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
23b0: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
23c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
23e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
23f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2420: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
2430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2440: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2450: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2460: 61 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65  abase */.  Bitve
2470: 63 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  c *pAlwaysRollba
2480: 63 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69  ck;    /* One bi
2490: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
24a0: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f  marked always-ro
24b0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72  llback */.  char
24c0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24f0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2500: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2510: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2540: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2550: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2560: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2570: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2580: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2590: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
25a0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
25b0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
25c0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
25d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25e0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *stfd;         /
25f0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2600: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
2610: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
2620: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2630: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2640: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2650: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2660: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2670: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2680: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2690: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
26a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
26e0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
26f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
2700: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
2710: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2720: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2730: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
2740: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
2750: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
2760: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
2770: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
2780: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
2790: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
27a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
27c0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
27d0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
27e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
27f0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
2800: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
2810: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
2820: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2830: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
2840: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
2850: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
2860: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
2870: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
2880: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
2890: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
28a0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
28b0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
28c0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
28d0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
28e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
28f0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2900: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2910: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
2920: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
2930: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2940: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
2950: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2960: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
2970: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
2980: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
2990: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
29a0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
29b0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
29c0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
29d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
29e0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
29f0: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
2a00: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a20: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
2a30: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2a40: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
2a50: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
2a60: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
2a70: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
2a80: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2a90: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
2aa0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
2ab0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
2ac0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
2ad0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
2ae0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
2af0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2b00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
2b10: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
2b20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
2b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
2b40: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
2b50: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
2b60: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
2b70: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
2b80: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
2b90: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
2ba0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
2bb0: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
2bc0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
2bd0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
2be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2bf0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
2c00: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2c10: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
2c20: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
2c30: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
2c40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2c50: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2c60: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
2c70: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
2c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
2c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2ca0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
2cb0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
2cc0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2ce0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
2cf0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
2d00: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
2d10: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
2d20: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
2d30: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2d40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2d50: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2d60: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2d70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2d80: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2d90: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2da0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2db0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2dc0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2dd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2de0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
2df0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
2e00: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
2e10: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2e20: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
2e30: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
2e40: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
2e50: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
2e60: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
2e70: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
2e80: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
2e90: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2ea0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
2eb0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
2ec0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
2ed0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
2ee0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
2ef0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
2f00: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
2f10: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2f20: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
2f30: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
2f40: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
2f50: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
2f60: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
2f70: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
2f80: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
2f90: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
2fa0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2fb0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
2fc0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
2fd0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
2fe0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
2ff0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3000: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3010: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3020: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3030: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3040: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3050: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3060: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3070: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3080: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3090: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
30a0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
30b0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
30c0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
30d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
30e0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
30f0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3100: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3110: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3120: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3130: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3140: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3150: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3160: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3170: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3180: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3190: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
31a0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
31b0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
31c0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
31d0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
31e0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
31f0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3200: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3210: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3220: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3230: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3240: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3250: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3260: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3270: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3280: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3290: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
32a0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
32b0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
32c0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
32d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
32e0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
32f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3300: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3310: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3320: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3330: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3350: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3360: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3370: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3380: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3390: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
33a0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
33b0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
33c0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
33d0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
33e0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
33f0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3400: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
34a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
34b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
34c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
34d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
34e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
34f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
35a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
35b0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
35c0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
35d0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
35e0: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
35f0: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
3600: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
3610: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
3620: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
3630: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
3640: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3650: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
3660: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3680: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
3690: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
36a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
36b0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
36c0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
36d0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
36e0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
36f0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
3700: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
3710: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
3720: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
3730: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
3740: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
3750: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
3760: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3770: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
3780: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3790: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
37a0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
37b0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
37c0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
37d0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
37e0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
37f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3800: 65 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68  e if page *pPg h
3810: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
3820: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
3830: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72  tatement.** jour
3840: 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  nal (or statemen
3850: 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62  t snapshot has b
3860: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20  een created, if 
3870: 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20  *pPg is part.** 
3880: 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  of an in-memory 
3890: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
38a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53  atic int pageInS
38b0: 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a  tatement(PgHdr *
38c0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
38d0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
38e0: 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  ger;.  if( MEMDB
38f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3900: 50 67 2d 3e 61 70 53 61 76 65 5b 31 5d 21 3d 30  Pg->apSave[1]!=0
3910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3920: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
3930: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
3940: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
3950: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
3960: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3970: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3980: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3990: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
39a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
39b0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
39c0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39d0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39e0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
3a00: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
3a10: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3a20: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a30: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a40: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a60: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
3a70: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
3a80: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
3a90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3aa0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
3ab0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
3ac0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
3ad0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
3ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3af0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
3b00: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
3b10: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
3b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
3b30: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
3b40: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
3b50: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
3b60: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
3b70: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
3b80: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
3b90: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
3ba0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
3bb0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3bc0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
3bd0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3be0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
3bf0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
3c00: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
3c10: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
3c20: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c40: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
3c50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
3c60: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
3c70: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
3c80: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
3c90: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
3ca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
3cb0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
3cc0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
3cd0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
3ce0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
3cf0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
3d00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
3d10: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
3d20: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
3d30: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
3d40: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
3d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d60: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
3d70: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3d80: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
3d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3da0: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
3db0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3dc0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
3dd0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
3de0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
3df0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
3e00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
3e10: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
3e20: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
3e30: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3e40: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
3e50: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
3e60: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
3e70: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3e80: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
3e90: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
3ea0: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
3eb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
3ec0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
3ed0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
3ee0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
3ef0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
3f00: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
3f10: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
3f20: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
3f30: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
3f40: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
3f50: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3f60: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
3f70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3f80: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
3f90: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
3fa0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
3fb0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
3fc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3fd0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
3ff0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
4000: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
4010: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
4020: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
4030: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
4040: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
4050: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
4060: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
4070: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
4080: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
4090: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
40a0: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
40b0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
40c0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
40d0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
40e0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
40f0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
4100: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
4110: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
4120: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
4130: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
4140: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
4150: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
4160: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
4170: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
4180: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
4190: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
41a0: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
41b0: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
41c0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
41d0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
41e0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
41f0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
4200: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4210: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
4220: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
4230: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4240: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
4250: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4260: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4270: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4280: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4290: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
42a0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
42b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
42c0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
42d0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
42e0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
42f0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4300: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4310: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4320: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4330: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4340: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4350: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4360: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4370: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4380: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4390: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
43a0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
43b0: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
43c0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
43d0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
43e0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
43f0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
4400: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4410: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
4420: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
4430: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
4440: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
4450: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
4460: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
4470: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
4480: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4490: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
44a0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
44b0: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
44c0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
44d0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
44e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
44f0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
4500: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
4510: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
4520: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
4530: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
4540: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
4550: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
4560: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
4570: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
4580: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4590: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
45a0: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
45b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
45c0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
45d0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
45e0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
45f0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
4600: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4610: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4620: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
4630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4640: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
4650: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
4660: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
4670: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
4680: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4690: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
46a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
46b0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
46c0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
46d0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
46e0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
46f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
4700: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
4710: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
4720: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
4730: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
4740: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
4750: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
4760: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
4770: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
4780: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
4790: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
47a0: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
47b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
47c0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
47d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
47e0: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
47f0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
4800: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
4810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4830: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
4840: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
4850: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
4860: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4870: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
4880: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
4890: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
48a0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
48b0: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
48c0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
48d0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
48e0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
48f0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
4900: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
4910: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
4920: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4930: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
4940: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
4950: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
4960: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4970: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4980: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
4990: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
49a0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
49b0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
49c0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
49d0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
49e0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
49f0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
4a00: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
4a10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
4a20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
4a30: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
4a40: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
4a50: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
4a60: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4a70: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
4a80: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
4a90: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
4aa0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
4ab0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
4ac0: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
4ad0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
4ae0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
4af0: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
4b00: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
4b10: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
4b20: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
4b30: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
4b40: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
4b50: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
4b60: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
4b70: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
4b80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
4b90: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
4ba0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
4bb0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
4bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
4bd0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4be0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
4bf0: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
4c00: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
4c10: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 0a  rCode || MEMDB .
4c20: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
4c30: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
4c40: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
4c50: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4c60: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4c70: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
4c80: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
4c90: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
4ca0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
4cb0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4cc0: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
4cd0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4ce0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
4cf0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
4d00: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
4d10: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
4d20: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
4d30: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
4d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
4d50: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
4d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
4d70: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
4d80: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
4d90: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
4da0: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
4db0: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
4dc0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
4dd0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
4de0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
4df0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
4e00: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
4e10: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
4e20: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
4e30: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
4e40: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
4e50: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
4e60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
4e70: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
4e80: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
4e90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
4ea0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
4eb0: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
4ec0: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
4ed0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
4ee0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
4ef0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
4f00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
4f10: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
4f20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
4f30: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4f40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4f50: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
4f60: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
4f70: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
4f80: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4fa0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
4fb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4fc0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
4fd0: 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72  ter, int nMaster
4fe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
4ff0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5000: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5010: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5030: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5040: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5050: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5060: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5070: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5080: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5090: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
50a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
50b0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
50c0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
50d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
50e0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
50f0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5100: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
5110: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
5120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5140: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5150: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5160: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5170: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5180: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5190: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
51a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
51b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
51c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
51d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
51e0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
51f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5200: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5220: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5240: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5250: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5260: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5280: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5290: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
52a0: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
52b0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
52c0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
52d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
52e0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
52f0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
5300: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
5310: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
5320: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5330: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5340: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5350: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5360: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5370: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5380: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5390: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
53a0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
53b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
53c0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
53d0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
53e0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
53f0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5400: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5410: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5420: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5430: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5440: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5460: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5470: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5480: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5490: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
54a0: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
54b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
54c0: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
54d0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
54e0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
54f0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5500: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5510: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5530: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5540: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5550: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5560: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5590: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
55b0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
55c0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
55d0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
55e0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
55f0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5600: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5610: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
5620: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
5630: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5640: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5650: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5660: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5670: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5680: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5690: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
56a0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
56b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
56c0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
56d0: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
56e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
56f0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5700: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5710: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5720: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5730: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5740: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5750: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
5760: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
5770: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
5780: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5790: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
57a0: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
57b0: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
57c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
57d0: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
57e0: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
57f0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5800: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
5810: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5820: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
5830: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5840: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
5850: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
5860: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 0a  Hdr[28] = {0};..
5870: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
5880: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
5890: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
58a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
58b0: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52  Limit;..    IOTR
58c0: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
58d0: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
58e0: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
58f0: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
5900: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5910: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
5920: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
5930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
5950: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
5960: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
5970: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
5980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
5990: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
59a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
59b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
59c0: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
59d0: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
59e0: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
59f0: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
5a00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5a10: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
5a20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5a30: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
5a40: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
5a50: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
5a60: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
5a70: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
5a80: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
5a90: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
5aa0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
5ab0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
5ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
5ad0: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
5ae0: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
5af0: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
5b00: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
5b10: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
5b20: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
5b30: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
5b40: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
5b50: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
5b60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5b70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5b80: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
5b90: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
5ba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5bb0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
5bc0: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
5bd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5be0: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
5bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
5c00: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
5c10: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
5c20: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
5c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5c40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5c50: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5c60: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
5c70: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
5c80: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
5c90: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
5ca0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
5cb0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
5cc0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
5cd0: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
5ce0: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
5cf0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
5d00: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
5d10: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
5d20: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
5d30: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
5d40: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
5d50: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
5d60: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
5d70: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
5d80: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
5d90: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
5da0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
5db0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
5dc0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
5dd0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
5de0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5df0: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
5e00: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
5e10: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
5e20: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
5e30: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
5e40: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
5e50: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
5e60: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
5e70: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5e80: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
5e90: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5ea0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5eb0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5ec0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5ed0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5ee0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
5ef0: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
5f00: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
5f10: 69 6e 74 20 6e 48 65 61 64 65 72 20 3d 20 70 50  int nHeader = pP
5f20: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
5f30: 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20    int nWrite;.. 
5f40: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
5f50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5f60: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
5f70: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
5f80: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5f90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5fa0: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
5fb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
5fc0: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
5fd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
5fe0: 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  }..  seekJournal
5ff0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  Hdr(pPager);.  p
6000: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6010: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
6020: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70  nalOff;..  memcp
6030: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
6040: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6050: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6060: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
6070: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
6080: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
6090: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
60a0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
60b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
60c0: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
60d0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
60e0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
60f0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
6100: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
6110: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
6120: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
6130: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
6140: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
6150: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
6160: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
6170: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
6180: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
6190: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
61a0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
61b0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
61c0: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
61d0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
61e0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
61f0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
6200: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
6210: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
6220: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
6230: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
6240: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
6250: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6260: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
6270: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
6280: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
6290: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
62a0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
62b0: 75 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ure occured whil
62c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
62d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
62e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
62f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
6300: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
6310: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
6320: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
6330: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
6340: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
6350: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
6360: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
6370: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
6380: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
6390: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
63a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
63b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
63c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
63d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
63e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
63f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
6400: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
6410: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
6420: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
6430: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
6440: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
6450: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
6460: 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
6470: 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66  r->noSync);.  if
6480: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
6490: 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  c) .   || (sqlit
64a0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
64b0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
64c0: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
64d0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
64e0: 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62  .  ){.    put32b
64f0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6500: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6510: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
6520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6530: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6540: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6550: 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20  lMagic)], 0);.  
6560: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
6570: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
6580: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
6590: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
65a0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
65b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
65c0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
65d0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
65e0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
65f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6600: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6610: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6620: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6630: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6640: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6650: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6660: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6670: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6680: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6690: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
66a0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
66b0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
66c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
66d0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
66e0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
66f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6700: 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20  nalHdr==0 ){.   
6710: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
6720: 65 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69  e */.    put32bi
6730: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6740: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6750: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
6760: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
6770: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
6780: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
6790: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
67a0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
67b0: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
67c0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
67d0: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
67e0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
67f0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
6800: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
6810: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
6820: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
6830: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
6840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6850: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
6860: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
6870: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
6880: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6890: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
68a0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
68b0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
68c0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
68d0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
68e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
68f0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
6900: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6910: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
6920: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
6930: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6940: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
6950: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
6960: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
6970: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
6980: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
6990: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
69a0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
69b0: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
69c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
69d0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
69e0: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
69f0: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
6a00: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
6a10: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
6a20: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
6a30: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
6a40: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
6a50: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
6a60: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
6a70: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
6a80: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
6a90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6aa0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
6ac0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
6ad0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
6ae0: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
6af0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
6b00: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
6b10: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
6b20: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
6b30: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
6b40: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
6b50: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
6b60: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
6b70: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
6b80: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
6b90: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6bb0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
6bc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
6bd0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
6be0: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
6bf0: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
6c00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
6c10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
6c20: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
6c30: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6c40: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6c50: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
6c60: 20 69 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a   int iPageSize;.
6c70: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
6c80: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6c90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6ca0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
6cb0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
6cc0: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6cd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6ce0: 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  NE;.  }.  jrnlOf
6cf0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
6d00: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20  nalOff;..  rc = 
6d10: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
6d20: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
6d30: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6d40: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  ), jrnlOff);.  i
6d50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6d60: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
6d70: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a  sizeof(aMagic);.
6d80: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
6d90: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6da0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6db0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6dc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6dd0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6de0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6df0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
6e00: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
6e10: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6e20: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6e30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6e40: 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72  nlOff+4, &pPager
6e50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6e60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6e70: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6e80: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6e90: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70  fd, jrnlOff+8, p
6ea0: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
6eb0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6ec0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6ed0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
6ee0: 72 6e 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20  rnlOff+16, (u32 
6ef0: 2a 29 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20  *)&iPageSize);. 
6f00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f10: 4f 4b 20 0a 20 20 20 26 26 20 69 50 61 67 65 53  OK .   && iPageS
6f20: 69 7a 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20  ize>=512 .   && 
6f30: 69 50 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54  iPageSize<=SQLIT
6f40: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
6f50: 0a 20 20 20 26 26 20 28 28 69 50 61 67 65 53 69  .   && ((iPageSi
6f60: 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
6f70: 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31  ==0 .  ){.    u1
6f80: 36 20 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61  6 pagesize = iPa
6f90: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
6fa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
6fb0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
6fc0: 20 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d   &pagesize);.  }
6fd0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6fe0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64  rn rc;..  /* Upd
6ff0: 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
7000: 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
7010: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
7020: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65  sed by .  ** the
7030: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
7040: 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
7050: 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
7060: 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65  nal was.  ** cre
7070: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
7080: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
7090: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
70a0: 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73   routine.  ** is
70b0: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
70c0: 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
70d0: 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
70e0: 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a  local value.  **
70f0: 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
7100: 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
7110: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
7120: 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  hat routine..  *
7130: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
7140: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7150: 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33   jrnlOff+12, (u3
7160: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
7170: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
7180: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7190: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
71a0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
71b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
71c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
71d0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  _OK;.}.../*.** W
71e0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
71f0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
7200: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
7210: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
7220: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
7230: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
7240: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
7250: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7260: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
7270: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
7280: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
7290: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
72a0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
72b0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
72c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
72d0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
72e0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
72f0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7300: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7310: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7320: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7330: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7340: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7350: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7360: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7370: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7380: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7390: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
73a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
73b0: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
73c0: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
73d0: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
73e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
73f0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7400: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7410: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7420: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7430: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7440: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7450: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7460: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7470: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7480: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7490: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
74a0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
74b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
74c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
74d0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
74e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
74f0: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7500: 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  ; .  i64 jrnlOff
7510: 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  ;.  i64 jrnlSize
7520: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  ;.  u32 cksum = 
7530: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73  0;.  char zBuf[s
7540: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7550: 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66  gic)+2*4];..  if
7560: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
7570: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
7580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7590: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  K;.  pPager->set
75a0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c  Master = 1;..  l
75b0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73  en = strlen(zMas
75c0: 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ter);.  for(i=0;
75d0: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
75e0: 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
75f0: 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  er[i];.  }..  /*
7600: 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
7610: 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
7620: 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
7630: 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
7640: 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
7650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7660: 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
7670: 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
7680: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
7690: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
76a0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
76b0: 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
76c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
76d0: 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65  llSync ){.    se
76e0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
76f0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c  ger);.  }.  jrnl
7700: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
7710: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
7720: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
7730: 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72  = (len+20);..  r
7740: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
7750: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7760: 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  lOff, PAGER_MJ_P
7770: 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
7780: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7790: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
77a0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a   jrnlOff += 4;..
77b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
77c0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
77d0: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  d, zMaster, len,
77e0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
77f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
7810: 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20  nlOff += len;.. 
7820: 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c   put32bits(zBuf,
7830: 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69   len);.  put32bi
7840: 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73  ts(&zBuf[4], cks
7850: 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  um);.  memcpy(&z
7860: 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c  Buf[8], aJournal
7870: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
7880: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
7890: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
78a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
78b0: 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66  , zBuf, 8+sizeof
78c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c  (aJournalMagic),
78d0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e   jrnlOff);.  jrn
78e0: 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66  lOff += 8+sizeof
78f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
7900: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
7910: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
7920: 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  oSync;..  /* If 
7930: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
7940: 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
7950: 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
7960: 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
7970: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
7980: 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
7990: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
79a0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
79b0: 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
79c0: 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
79d0: 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
79e0: 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
79f0: 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
7a00: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
7a10: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
7a20: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
7a30: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
7a40: 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
7a50: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7a60: 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
7a70: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
7a80: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
7a90: 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
7aa0: 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
7ab0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
7ac0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
7ad0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
7ae0: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
7af0: 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
7b00: 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
7b10: 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
7b20: 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63 20 3d  _OK).   && (rc =
7b30: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
7b40: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
7b50: 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c  &jrnlSize))==SQL
7b60: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e  ITE_OK.   && jrn
7b70: 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20  lSize>jrnlOff.  
7b80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7b90: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
7ba0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7bb0: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
7bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
7bd0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
7be0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
7bf0: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7c00: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7c10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7c20: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
7c30: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7c40: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7c50: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7c60: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7c70: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  o){.  PgHdr *p;.
7c80: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
7c90: 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
7ca0: 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
7cb0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
7cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
7cd0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
7ce0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
7cf0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
7d00: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
7d10: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
7d20: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
7d30: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
7d40: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
7d50: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
7d60: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
7d70: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
7d80: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
7d90: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
7da0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
7db0: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
7dc0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7dd0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
7de0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
7df0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
7e00: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
7e10: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
7e20: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
7e30: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
7e40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
7e50: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
7e60: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
7e70: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
7e80: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
7e90: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
7ea0: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
7eb0: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
7ec0: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
7ed0: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
7ee0: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
7ef0: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
7f00: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
7f10: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
7f20: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
7f30: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
7f40: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
7f50: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
7f60: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
7f70: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
7f80: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
7f90: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
7fa0: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
7fb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7fc0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
7fd0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
7fe0: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
7ff0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
8000: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
8010: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
8020: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
8030: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8040: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  = rc;.      pPag
8050: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
8060: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
8070: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
8080: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f  Pager))..      /
8090: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
80a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
80b0: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
80c0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
80d0: 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
80e0: 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e  ise, another con
80f0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
8100: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
8110: 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20   might.      ** 
8120: 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  delete the file 
8130: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
8140: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
8150: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8160: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8180: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
8190: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
81a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
81b0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
81c0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
81d0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
81e0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  al);.        pPa
81f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
8200: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
8210: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
8220: 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
8230: 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sRollback);.    
8240: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
8250: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8260: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8270: 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
8280: 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
8290: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
82a0: 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
82b0: 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74  ot be.      ** t
82c0: 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
82d0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
82e0: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  is unlocked, the
82f0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
8300: 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20  .      ** cache 
8310: 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
8320: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
8330: 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72  ode safely clear
8340: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
8350: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
8360: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
8370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8380: 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72  _OK ) pPager->er
8390: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
83a0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  K;.        pager
83b0: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
83c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
83d0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
83e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
83f0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
8400: 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20  >stfd);.        
8410: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
8420: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
8430: 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  InStmt);.       
8440: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
8450: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
8460: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
8470: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8480: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
8490: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
84a0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
84b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
84c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
84d0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
84e0: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
84f0: 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
8500: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
8510: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
8520: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8530: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
8540: 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  DB || pPager->er
8550: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
8560: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
8570: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8580: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50  UNLOCK;.      pP
8590: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
85a0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d  tDone = 0;.    }
85b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
85c0: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
85d0: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
85e0: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
85f0: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
8600: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
8610: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
8620: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
8630: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
8640: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  .** do not attem
8650: 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  pt the rollback.
8660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8670: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
8680: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
8690: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
86a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
86b0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
86c0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
86d0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
86e0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
86f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
8700: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
8710: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8720: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
8730: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d  ger_unlock(p);.}
8740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8750: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
8760: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
8770: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
8780: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
8790: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
87a0: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
87b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
87c0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
87d0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
87e0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
87f0: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
8800: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
8810: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
8820: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8830: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
8840: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
8850: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
8860: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
8870: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
8880: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
8890: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
88a0: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
88b0: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
88c0: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
88d0: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
88e0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
88f0: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
8900: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
8910: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
8920: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
8930: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
8940: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
8950: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
8960: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
8970: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
8980: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
8990: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
89a0: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
89b0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
89c0: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
89d0: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
89e0: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
89f0: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
8a00: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
8a10: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
8a20: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
8a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8a40: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
8a50: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
8a60: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
8a70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8a80: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8a90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8aa0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8ab0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8ac0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8ad0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8ae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8af0: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8b00: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8b10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
8b20: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
8b30: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8b40: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
8b50: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
8b60: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
8b70: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
8b80: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
8b90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8ba0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
8bb0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8bc0: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
8bd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8be0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8bf0: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
8c00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
8c10: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
8c20: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
8c30: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
8c40: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
8c50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8c60: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
8c70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8c80: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
8c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8ca0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
8cb0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
8cc0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8cd0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
8ce0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8cf0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
8d00: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
8d10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8d20: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
8d30: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
8d40: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
8d50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8d60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
8d70: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
8d80: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
8d90: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
8da0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8db0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8dc0: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
8dd0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 70 50 61 67  lback);.    pPag
8de0: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8df0: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ack = 0;.    sql
8e00: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
8e10: 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
8e20: 68 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  he);.#ifdef SQLI
8e30: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
8e40: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
8e50: 49 74 65 72 61 74 65 28 70 50 61 67 65 72 2d 3e  Iterate(pPager->
8e60: 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
8e70: 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65  et_pagehash);.#e
8e80: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
8e90: 50 63 61 63 68 65 43 6c 65 61 72 46 6c 61 67 73  PcacheClearFlags
8ea0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
8eb0: 2c 0a 20 20 20 20 20 20 20 50 47 48 44 52 5f 49  ,.       PGHDR_I
8ec0: 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47 48 44  N_JOURNAL | PGHD
8ed0: 52 5f 4e 45 45 44 5f 53 59 4e 43 0a 20 20 20 20  R_NEED_SYNC.    
8ee0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
8ef0: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
8f00: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
8f10: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
8f20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
8f30: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
8f40: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
8f50: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8f60: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
8f70: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
8f80: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
8f90: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
8fa0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
8fb0: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
8fc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8fd0: 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29  ==PAGER_SYNCED )
8fe0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
8ff0: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
9000: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61  USIVE;.  }.  pPa
9010: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
9020: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
9030: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
9040: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9050: 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69   = 0;.  /* lruLi
9060: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
9070: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
9080: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
9090: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  -1;.  pPager->db
90a0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
90b0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
90c0: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
90e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
90f0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
9100: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
9110: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
9120: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
9130: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
9140: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
9150: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
9160: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
9170: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
9180: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
9190: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
91a0: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
91b0: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
91c0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
91d0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
91e0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
91f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
9200: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
9210: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
9220: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
9230: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
9240: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
9250: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
9260: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
9270: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
9280: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
9290: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
92a0: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
92b0: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
92c0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
92d0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
92e0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
92f0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
9300: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
9310: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
9320: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
9330: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
9340: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
9350: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
9360: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
9370: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
9380: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
9390: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
93a0: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
93b0: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
93c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
93d0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
93e0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
93f0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
9400: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
9410: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
9420: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
9430: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
9440: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
9450: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
9460: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
9470: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
9480: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
9490: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
94a0: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
94b0: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
94c0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
94d0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
94e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
94f0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
9500: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
9510: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
9520: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
9530: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
9540: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
9550: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
9560: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
9570: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
9580: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
9590: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
95a0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  cksum;.}../* For
95b0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
95c0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
95d0: 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a  makeClean(PgHdr*
95e0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  );../*.** Read a
95f0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
9600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
9610: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
9620: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
9630: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
9640: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
9650: 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72  .** The isMainJr
9660: 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  nl flag is true 
9670: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  if this is the m
9680: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
9690: 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73  rnal and.** fals
96a0: 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  e for the statem
96b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
96c0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
96d0: 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20  journal uses.** 
96e0: 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
96f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9700: 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73  l does not..*/.s
9710: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9720: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
9730: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
9740: 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  er,       /* The
9750: 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
9760: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73 71  yed back */.  sq
9770: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c  lite3_file *jfd,
9780: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74     /* The file t
9790: 68 61 74 20 69 73 20 74 68 65 20 6a 6f 75 72 6e  hat is the journ
97a0: 61 6c 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  al being rolled 
97b0: 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f 66  back */.  i64 of
97c0: 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
97d0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * Offset of the 
97e0: 70 61 67 65 20 77 69 74 68 69 6e 20 74 68 65 20  page within the 
97f0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
9800: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20 20   isMainJrnl     
9810: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d 61    /* True for ma
9820: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
9830: 6e 61 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  nal. False for S
9840: 74 6d 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20  tmt jrnl */.){. 
9850: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9860: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
9870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
9880: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
9890: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
98a0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98c0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
98d0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
98e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
98f0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9900: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9910: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9920: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9930: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9940: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9950: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9960: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
9970: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d  age */..  /* isM
9980: 61 69 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20 62  ainJrnl should b
9990: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
99a0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
99b0: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
99c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
99d0: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
99e0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
99f0: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
9a00: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 69  ssert( jfd == (i
9a10: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
9a20: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
9a30: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
9a40: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
9a50: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
9a60: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
9a70: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
9a80: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9a90: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
9aa0: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
9ab0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9ac0: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
9ad0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
9ae0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9af0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
9b00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
9b10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
9b20: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
9b30: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
9b40: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
9b50: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
9b60: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
9b70: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
9b80: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
9b90: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
9ba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
9bb0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
9bc0: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
9bd0: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
9be0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
9bf0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
9c00: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
9c10: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
9c20: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
9c30: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
9c40: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
9c50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
9c60: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
9c70: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
9c80: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9c90: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
9ca0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
9cb0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
9cc0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9cd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9ce0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
9cf0: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
9d00: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
9d10: 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61  ffset+pPager->pa
9d20: 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d  geSize+4, &cksum
9d30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9d40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
9d50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9d60: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
9d70: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
9d80: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
9d90: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
9da0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9db0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
9dc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9dd0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
9de0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
9df0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9e00: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
9e10: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9e20: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9e30: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
9e40: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
9e50: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
9e60: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
9e70: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
9e80: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
9e90: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
9ea0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
9eb0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9ec0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
9ed0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
9ee0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
9ef0: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
9f00: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
9f10: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
9f20: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
9f30: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
9f40: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
9f50: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
9f60: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
9f70: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
9f80: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
9f90: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
9fa0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
9fb0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
9fc0: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
9fd0: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
9fe0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
9ff0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
a000: 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
a010: 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
a020: 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
a030: 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
a040: 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
a050: 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
a060: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
a070: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
a080: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
a090: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
a0a0: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
a0b0: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
a0c0: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
a0d0: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
a0e0: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
a0f0: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
a100: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
a110: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
a120: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
a130: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
a140: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
a150: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
a160: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a170: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
a180: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
a190: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
a1a0: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
a1b0: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
a1c0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
a1d0: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
a1e0: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
a1f0: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
a200: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
a210: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
a220: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
a230: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
a240: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
a250: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
a260: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
a270: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
a280: 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
a290: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
a2a0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
a2b0: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
a2c0: 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
a2d0: 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
a2e0: 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
a2f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
a300: 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
a310: 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
a320: 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
a330: 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
a340: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
a350: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
a360: 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
a370: 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
a380: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
a390: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
a3a0: 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
a3b0: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
a3c0: 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
a3d0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
a3e0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
a3f0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
a400: 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
a410: 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
a420: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
a430: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
a440: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
a450: 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
a460: 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
a470: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
a480: 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
a490: 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
a4a0: 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
a4b0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
a4c0: 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
a4d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
a4e0: 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
a4f0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
a500: 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
a510: 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
a520: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
a530: 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
a540: 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
a550: 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
a560: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
a570: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
a580: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
a590: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
a5a0: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
a5b0: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
a5c0: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
a5d0: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
a5e0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
a5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
a600: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 28 70 50  ata));.  if( (pP
a610: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
a620: 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  ER_EXCLUSIVE).  
a630: 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30   && (pPg==0 || 0
a640: 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ==(pPg->flags&PG
a650: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a  HDR_NEED_SYNC)).
a660: 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66     && (pPager->f
a670: 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29  d->pMethods).  )
a680: 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
a690: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
a6a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
a6b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a6c0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
a6d0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
a6e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
a6f0: 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
a700: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
a710: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
a720: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
a730: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
a740: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
a750: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
a760: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
a770: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
a780: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
a790: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
a7a0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
a7b0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
a7c0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
a7d0: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
a7e0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
a7f0: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
a800: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
a810: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
a820: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
a830: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
a840: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
a850: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
a860: 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
a870: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a880: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a890: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a8a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a8b0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a8c0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a8d0: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a8e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a8f0: 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
a900: 72 6e 6c 20 29 20 6d 61 6b 65 43 6c 65 61 6e 28  rnl ) makeClean(
a910: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
a920: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
a930: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
a940: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
a950: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
a960: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
a970: 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
a980: 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
a990: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
a9a0: 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
a9b0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
a9c0: 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
a9d0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
a9e0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
a9f0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
aa00: 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
aa10: 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
aa20: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
aa30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
aa40: 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
aa50: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
aa60: 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
aa70: 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
aa80: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
aa90: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
aaa0: 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
aab0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
aad0: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
aae0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
aaf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ab00: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
ab10: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
ab20: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
ab30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ab40: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
ab50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
ab60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
ab70: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
ab80: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
ab90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
aba0: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
abb0: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
abc0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
abd0: 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f  t zMaster may po
abe0: 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d  int to Pager.pTm
abf0: 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20  pSpace. So that 
ac00: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a  buffer is not .*
ac10: 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
ac20: 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  use within this 
ac30: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a  function..**.**.
ac40: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
ac50: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
ac60: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
ac70: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
ac80: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
ac90: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
aca0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
acb0: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
acc0: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
acd0: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
ace0: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
acf0: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
ad00: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
ad10: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
ad20: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
ad30: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
ad40: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
ad50: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
ad60: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
ad70: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
ad80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
ad90: 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
ada0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
adb0: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
adc0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
add0: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  er_open = 0;.  s
ade0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
adf0: 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ster;.  sqlite3_
ae00: 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a  file *pJournal;.
ae10: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
ae20: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
ae30: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
ae40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
ae50: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
ae60: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
ae70: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
ae80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
ae90: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
aea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
aeb0: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
aec0: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
aed0: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
aee0: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
aef0: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
af00: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
af10: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
af20: 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ce..  */.  pMast
af30: 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
af40: 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
af50: 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  oc(pVfs->szOsFil
af60: 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
af70: 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
af80: 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
af90: 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
afa0: 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
afb0: 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
afc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
afd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
afe0: 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
aff0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
b000: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
b010: 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
b020: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b030: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
b040: 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
b050: 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
b060: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b070: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
b080: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
b090: 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d  pen = 1;..  rc =
b0a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b0b0: 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
b0c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
b0d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b0e0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b0f0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
b100: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
b110: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
b120: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
b130: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
b140: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
b150: 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Ptr = pPager->pV
b160: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
b170: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
b180: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
b190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
b1a0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
b1b0: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
b1c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
b1d0: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
b1e0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
b1f0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
b200: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
b210: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  har *)sqlite3Mal
b220: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
b230: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
b240: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
b250: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
b260: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b270: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
b280: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
b290: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
b2a0: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
b2b0: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
b2c0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
b2d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
b2e0: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
b2f0: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
b300: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
b310: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b320: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b330: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
b340: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
b350: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
b360: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
b370: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
b380: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
b390: 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b       int exists;
b3a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b3b0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
b3c0: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
b3d0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
b3e0: 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
b3f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
b410: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b420: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
b430: 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
b440: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
b450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
b460: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
b470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
b480: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
b490: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
b4a0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
b4b0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
b4c0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
b4d0: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
b4e0: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
b4f0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
b500: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
b510: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
b520: 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
b530: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
b540: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
b550: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
b560: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
b570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b580: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
b590: 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
b5a0: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
b5b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b5c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
b5d0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
b5e0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
b5f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
b600: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
b610: 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
b620: 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
b630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b640: 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
b650: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
b660: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b670: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
b680: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b690: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
b6a0: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
b6b0: 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
b6c0: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
b6d0: 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
b6e0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
b6f0: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
b700: 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
b710: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
b720: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
b730: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
b740: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b760: 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
b770: 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f  l += (strlen(zJo
b780: 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d  urnal)+1);.    }
b790: 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73  .  }.  .  rc = s
b7a0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
b7b0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
b7c0: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
b7d0: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
b7e0: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
b7f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
b800: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20  erJournal);.  } 
b810: 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f   .  if( master_o
b820: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
b830: 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
b840: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
b850: 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
b860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b870: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
b880: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
b890: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
b8a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
b8b0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
b8c0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
b8d0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
b8e0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
b8f0: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
b900: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
b910: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
b920: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
b930: 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20  .** Might might 
b940: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
b950: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
b960: 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
b970: 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73  n nPage..** This
b980: 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
b990: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20   example, if we 
b9a0: 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  are in the middl
b9b0: 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  e of a transacti
b9c0: 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20  on.** which has 
b9d0: 65 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c  extended the fil
b9e0: 65 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  e size and the n
b9f0: 65 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69  ew pages are sti
ba00: 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69  ll all held.** i
ba10: 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e  n cache, then an
ba20: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
ba30: 45 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65  E does a stateme
ba40: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f  nt rollback.  So
ba50: 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  me.** operating 
ba60: 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
ba70: 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
ba80: 6f 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74  onfused if you t
ba90: 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74  ry to.** truncat
baa0: 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
bab0: 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
bac0: 72 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72  rger than it cur
bad0: 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f  rently is,.** so
bae0: 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
baf0: 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
bb00: 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
bb10: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
bb20: 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73   new.** file ins
bb30: 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tead..*/.static 
bb40: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
bb50: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
bb60: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
bb70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb80: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
bb90: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
bba0: 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67  XCLUSIVE && pPag
bbb0: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
bbc0: 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
bbd0: 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
bbe0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
bbf0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
bc00: 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
bc10: 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
bc20: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
bc30: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
bc40: 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
bc50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
bc60: 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
bc70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
bc80: 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
bc90: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
bca0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
bcb0: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
bcc0: 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
bcd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
bce0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
bcf0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
bd00: 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
bd10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bd20: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
bd30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
bd40: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
bd50: 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
bd60: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
bd70: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
bd80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bd90: 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f  ** Set the secto
bda0: 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69  rSize for the gi
bdb0: 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  ven pager..**.**
bdc0: 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
bdd0: 20 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20   is at least as 
bde0: 62 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f  big as the secto
bdf0: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
be00: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
be10: 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68  ectorSize().  Th
be20: 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72  e minimum sector
be30: 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f   size is 512..*/
be40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
be50: 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
be60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
be70: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
be80: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
be90: 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
bea0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
beb0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
bec0: 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
bed0: 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
bee0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
bef0: 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
bf00: 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
bf10: 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
bf20: 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65  t, in whcih case
bf30: 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
bf40: 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
bf50: 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
bf60: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
bf70: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
bf80: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
bf90: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
bfa0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
bfb0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32  ->sectorSize<512
bfc0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
bfd0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
bfe0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
bff0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
c000: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
c010: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
c020: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
c030: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
c040: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
c050: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
c060: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
c070: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
c080: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
c090: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
c0a0: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
c0b0: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
c0c0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
c0d0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
c0e0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c0f0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
c100: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
c110: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
c120: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
c130: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
c140: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c150: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
c160: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
c170: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
c180: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c190: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
c1a0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
c1b0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c1c0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
c1d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
c1e0: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
c1f0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
c200: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
c210: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
c220: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
c230: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
c240: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
c250: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
c260: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
c270: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
c280: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c290: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
c2a0: 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
c2b0: 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
c2c0: 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
c2d0: 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
c2e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c2f0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c300: 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20  e page case..** 
c310: 20 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74   (7)  4 byte int
c320: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c330: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c340: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
c350: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
c360: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
c370: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
c380: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
c390: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
c3a0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
c3b0: 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79  .).**  (8)  N by
c3c0: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
c3d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
c3e0: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
c3f0: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
c400: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
c410: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
c420: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
c430: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
c440: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
c450: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
c460: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
c470: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
c480: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
c490: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
c4a0: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
c4b0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
c4c0: 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72  -8..**  (9)  Zer
c4d0: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
c4e0: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
c4f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
c500: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
c510: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
c520: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
c530: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
c540: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
c550: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
c560: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
c570: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
c580: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c590: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
c5a0: 72 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76  rst 8 items abov
c5b0: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
c5c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
c5d0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
c5e0: 66 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a  f the 9th item..
c5f0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
c600: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
c610: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
c620: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
c630: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
c640: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
c650: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
c660: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
c670: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
c680: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
c690: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
c6a0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c6b0: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
c6c0: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
c6d0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
c6e0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
c6f0: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
c700: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
c710: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
c720: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c730: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
c740: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
c750: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
c760: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
c770: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
c780: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
c790: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
c7a0: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
c7b0: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
c7c0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
c7d0: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
c7e0: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
c7f0: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
c800: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
c810: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
c820: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
c830: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
c840: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
c850: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
c860: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
c870: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
c880: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
c890: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
c8a0: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
c8b0: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
c8c0: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
c8d0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
c8e0: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
c8f0: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
c900: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
c910: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
c920: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
c930: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
c940: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
c950: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
c960: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
c970: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
c980: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
c990: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
c9a0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
c9b0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
c9c0: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
c9d0: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
c9e0: 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
c9f0: 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
ca00: 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
ca10: 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
ca20: 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
ca30: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
ca40: 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
ca50: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
ca60: 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
ca70: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
ca80: 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
ca90: 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
caa0: 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
cab0: 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
cac0: 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
cad0: 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
cae0: 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
caf0: 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
cb00: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
cb10: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cb20: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cb30: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
cb40: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
cb50: 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
cb60: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
cb70: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
cb80: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cba0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
cbb0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
cbc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cbe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
cbf0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
cc00: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
cc30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
cc40: 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
cc50: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cc60: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
cc70: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
cc80: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cca0: 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
ccb0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
ccc0: 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
ccd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
cce0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
ccf0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
cd00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
cd10: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
cd20: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
cd30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
cd40: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
cd50: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
cd60: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
cd70: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
cd80: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
cd90: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
cda0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
cdb0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
cdc0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
cdd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cde0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
cdf0: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
ce00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
ce10: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
ce20: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
ce30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
ce40: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
ce50: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
ce60: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
ce70: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
ce80: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
ce90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cea0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
ceb0: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
cec0: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
ced0: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
cee0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
cef0: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
cf00: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
cf10: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
cf20: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
cf30: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
cf40: 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
cf50: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
cf60: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
cf70: 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
cf80: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
cf90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cfa0: 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
cfb0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
cfc0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
cfd0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
cfe0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
cff0: 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
d000: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
d010: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d020: 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
d030: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d040: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d050: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
d060: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
d070: 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
d080: 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
d090: 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
d0a0: 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
d0b0: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
d0c0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
d0d0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
d0e0: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
d0f0: 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
d100: 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
d110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
d120: 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
d130: 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
d140: 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
d150: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
d160: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
d170: 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
d180: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
d190: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
d1a0: 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
d1b0: 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
d1c0: 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
d1d0: 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
d1e0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
d1f0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
d200: 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
d210: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
d220: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
d230: 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
d240: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
d250: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
d260: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
d270: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d280: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
d290: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
d2a0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
d2b0: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
d2c0: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
d2d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
d2e0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
d2f0: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
d300: 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
d310: 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
d320: 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
d330: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
d340: 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
d350: 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
d360: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
d370: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
d380: 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
d390: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
d3a0: 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
d3b0: 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
d3c0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
d3d0: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
d3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d3f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
d400: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d410: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
d420: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
d430: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d440: 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
d450: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
d460: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
d470: 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
d480: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
d490: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
d4a0: 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
d4b0: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
d4c0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
d4d0: 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
d4e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
d4f0: 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
d500: 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
d510: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d520: 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
d530: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
d540: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
d550: 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
d560: 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
d570: 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
d580: 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
d590: 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
d5a0: 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
d5b0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
d5c0: 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
d5d0: 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
d5e0: 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
d5f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d600: 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
d610: 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
d620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
d630: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
d650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
d660: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
d670: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
d680: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
d690: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
d6a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
d6b0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
d6c0: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
d6d0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
d6e0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
d6f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
d700: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
d710: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
d720: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
d730: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
d740: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
d750: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
d760: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
d770: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
d780: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
d790: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d7a0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
d7b0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
d7c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
d7d0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
d7e0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
d7f0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
d800: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
d810: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
d820: 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
d830: 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
d840: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
d850: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
d860: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
d870: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
d880: 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
d890: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d8a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
d8b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
d8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
d8d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d8e0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
d8f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d900: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
d910: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
d920: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
d930: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
d940: 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  to rollback, the
d950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
d960: 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20  s probably.     
d970: 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f       ** going to
d980: 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f   end up being co
d990: 72 72 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f  rrupt.  It is co
d9a0: 72 72 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79  rrupt to us, any
d9b0: 68 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  how..          *
d9c0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65  * Perhaps the ne
d9d0: 78 74 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  xt process to co
d9e0: 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78  me along can fix
d9f0: 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20   it.....        
da00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
da10: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
da20: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
da30: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
da40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
da60: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
da70: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
da80: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
da90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
daa0: 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
dab0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
dac0: 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
dad0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
dae0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
daf0: 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
db00: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
db10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
db20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
db30: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
db40: 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
db50: 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
db60: 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28  '\0');.  }.  if(
db70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
db80: 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
db90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
dba0: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
dbb0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
dbc0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
dbd0: 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
dbe0: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
dbf0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
dc00: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
dc10: 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
dc20: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
dc30: 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
dc40: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
dc50: 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
dc60: 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
dc70: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
dc80: 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
dc90: 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
dca0: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
dcb0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
dcc0: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
dcd0: 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
dce0: 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
dcf0: 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
dd00: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
dd10: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
dd20: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
dd30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
dd40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
dd50: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
dd60: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
dd70: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
dd80: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
dd90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dda0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
ddb0: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
ddc0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
ddd0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
dde0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
ddf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
de00: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
de10: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
de20: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
de30: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
de40: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
de50: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
de60: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
de70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
de80: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
de90: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
dea0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
deb0: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
dec0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
ded0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
dee0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
def0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
df00: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
df10: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
df20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df30: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
df40: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
df50: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
df80: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
df90: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
dfa0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
dfb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dfc0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
dfd0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
dfe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dff0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e000: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
e010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e020: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68  Off;..  /* Set h
e030: 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
e040: 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
e050: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e060: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
e070: 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
e080: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
e090: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
e0a0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
e0b0: 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
e0c0: 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
e0d0: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
e0e0: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
e0f0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
e100: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
e110: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
e120: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
e130: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
e140: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
e150: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
e160: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
e170: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
e180: 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
e190: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
e1a0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
e1b0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
e1c0: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
e1d0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
e1e0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
e1f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
e200: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
e210: 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
e220: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
e230: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
e240: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
e250: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
e260: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e270: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
e280: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e290: 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  en );.  nRec = p
e2a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
e2b0: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
e2c0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
e2d0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
e2e0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
e2f0: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
e300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e310: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
e320: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
e330: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
e340: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
e350: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
e360: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
e370: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
e380: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
e390: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
e3a0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
e3b0: 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
e3c0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
e3d0: 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
e3e0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
e3f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
e400: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
e410: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f   pPager->stfd, o
e420: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61  ffset, 0);.    a
e430: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e440: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
e450: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e460: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
e470: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
e480: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
e490: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
e4a0: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
e4b0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
e4c0: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
e4d0: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
e4e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e4f0: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
e500: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
e510: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
e520: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
e530: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
e540: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
e550: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
e560: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
e570: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
e580: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
e590: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
e5a0: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
e5b0: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
e5c0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
e5d0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
e5e0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
e5f0: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
e600: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
e610: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
e620: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
e630: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
e640: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
e650: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
e660: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
e670: 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
e680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e690: 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
e6a0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
e6b0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
e6c0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
e6d0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
e6e0: 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61  alOff, 1);.    a
e6f0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e700: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
e710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e720: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
e730: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
e740: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
e750: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
e760: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
e770: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
e780: 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
e790: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
e7a0: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
e7b0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
e7c0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
e7d0: 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
e7e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e7f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
e800: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e810: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
e820: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
e830: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
e840: 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
e850: 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
e860: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
e870: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
e880: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
e890: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
e8a0: 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
e8b0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
e8c0: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
e8d0: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
e8e0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
e8f0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
e900: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
e910: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
e920: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
e930: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
e940: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
e950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
e960: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
e970: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
e980: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e990: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
e9a0: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
e9b0: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
e9c0: 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
e9d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e9e0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
e9f0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
ea00: 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
ea10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ea20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
ea30: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
ea40: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
ea50: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
ea60: 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
ea70: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
ea80: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
ea90: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
eaa0: 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
eab0: 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
eac0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
ead0: 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
eae0: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
eaf0: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
eb00: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
eb10: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
eb20: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
eb30: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
eb40: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
eb50: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
eb60: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
eb70: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
eb80: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
eb90: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
eba0: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
ebb0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
ebc0: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
ebd0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
ebe0: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
ebf0: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
ec00: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
ec10: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
ec20: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
ec30: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
ec40: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
ec50: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
ec60: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
ec70: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
ec80: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
ec90: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
eca0: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
ecb0: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
ecc0: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
ecd0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
ece0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
ecf0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
ed00: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
ed10: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
ed20: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
ed30: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
ed40: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
ed50: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
ed60: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
ed70: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
ed80: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
ed90: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
eda0: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
edb0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
edc0: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
edd0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
ede0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
edf0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
ee00: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
ee10: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
ee20: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
ee30: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
ee40: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
ee50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
ee60: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
ee70: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
ee80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
ee90: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
eea0: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
eeb0: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
eec0: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
eed0: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
eee0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
eef0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
ef00: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
ef10: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
ef20: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
ef30: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
ef40: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
ef50: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
ef60: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
ef70: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
ef80: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
ef90: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
efa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
efb0: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
efc0: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
efd0: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
efe0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
eff0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
f000: 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
f010: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
f020: 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
f030: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
f040: 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29   int bFullFsync)
f050: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
f060: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
f070: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
f080: 6c 65 20 7c 7c 20 4d 45 4d 44 42 3b 0a 20 20 70  le || MEMDB;.  p
f090: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
f0a0: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
f0b0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
f0c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
f0d0: 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73  flags = (bFullFs
f0e0: 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ync?SQLITE_SYNC_
f0f0: 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43  FULL:SQLITE_SYNC
f100: 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20  _NORMAL);.  if( 
f110: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
f120: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
f130: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
f140: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f150: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
f160: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
f170: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
f180: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
f190: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
f1a0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
f1b0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
f1c0: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
f1d0: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
f1e0: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
f1f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
f200: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
f210: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
f220: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
f230: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
f240: 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  y file. .**.** W
f250: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
f260: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
f270: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
f280: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
f290: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
f2a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
f2b0: 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
f2c0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
f2d0: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
f2e0: 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77  porary.** file w
f2f0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
f300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f310: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
f320: 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
f330: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
f340: 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
f350: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
f360: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
f370: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
f380: 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
f390: 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
f3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
f3b0: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
f3c0: 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
f3d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
f3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
f3f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
f400: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
f410: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
f420: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
f430: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
f440: 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
f450: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
f460: 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
f470: 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
f480: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
f490: 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
f4a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
f4b0: 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
f4c0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
f4d0: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
f4e0: 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
f4f0: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
f500: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f510: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
f520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f530: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
f540: 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
f550: 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a  ,PgHdr *);../*.*
f560: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
f570: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
f580: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
f590: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
f5a0: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
f5b0: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
f5c0: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
f5d0: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
f5e0: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
f5f0: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
f600: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
f610: 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
f620: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
f630: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
f640: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
f650: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
f660: 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
f670: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
f680: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
f690: 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
f6a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
f6b0: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
f6c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
f6d0: 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
f6e0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
f6f0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
f700: 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
f710: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
f720: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
f730: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
f740: 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
f750: 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
f760: 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
f770: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
f780: 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
f790: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
f7a0: 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
f7b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
f7c0: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
f7d0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
f7e0: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
f7f0: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
f800: 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
f810: 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
f820: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
f830: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
f840: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
f850: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
f860: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
f870: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f880: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
f890: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 76 6f 69 64  o open */.  void
f8a0: 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
f8b0: 2a 29 2c 20 20 2f 2a 20 50 61 67 65 20 64 65 73  *),  /* Page des
f8c0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
f8d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
f8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f8f0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
f900: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
f910: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
f920: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
f930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
f940: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
f950: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
f960: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
f970: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
f980: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
f990: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
f9a0: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38  pen() */.){.  u8
f9b0: 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
f9c0: 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  *pPager = 0;.  i
f9d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f9e0: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
f9f0: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
fa00: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
fa10: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
fa20: 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
fa30: 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
fa40: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
fa50: 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
fa60: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
fa70: 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
fa80: 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e  ADLOCK)!=0;.  in
fa90: 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
faa0: 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
fab0: 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
fac0: 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
fad0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
fae0: 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73 7a 50 61  ze();.  int szPa
faf0: 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
fb00: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
fb10: 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  E;.  char *zPath
fb20: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
fb30: 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a  nPathname = 0;..
fb40: 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
fb50: 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
fb60: 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
fb70: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
fb80: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
fb90: 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
fba0: 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
fbb0: 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
fbc0: 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
fbd0: 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
fbe0: 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
fbf0: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
fc00: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
fc10: 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
fc20: 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
fc30: 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
fc40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
fc50: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
fc60: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
fc70: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
fc80: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
fc90: 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
fca0: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
fcb0: 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
fcc0: 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
fcd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
fce0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fcf0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
fd00: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
fd10: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
fd20: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
fd30: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
fd40: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
fd50: 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
fd60: 30 3b 0a 20 20 20 20 20 20 75 73 65 4a 6f 75 72  0;.      useJour
fd70: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  nal = 0;.    }el
fd80: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
fd90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fda0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
fdb0: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
fdc0: 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
fdd0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
fde0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
fdf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
fe00: 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
fe10: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
fe20: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
fe30: 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74    nPathname = st
fe40: 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b  rlen(zPathname);
fe50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
fe60: 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
fe70: 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
fe80: 72 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d  re */.  pPager =
fe90: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
fea0: 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a  ro(.    sizeof(*
feb0: 70 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20  pPager) +       
fec0: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
fed0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 63  ucture */.    pc
fee0: 61 63 68 65 53 69 7a 65 20 20 20 20 20 20 2b 20  acheSize      + 
fef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
ff00: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
ff10: 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
ff20: 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e +           /*
ff30: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ff40: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a  e structure */ .
ff50: 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
ff60: 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20  le * 3 +        
ff70: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61  /* The main db a
ff80: 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  nd two journal f
ff90: 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e  iles */ .    3*n
ffa0: 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20  Pathname + 40   
ffb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
ffc0: 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72  ename, zDirector
ffd0: 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  y, zJournal */. 
ffe0: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
fff0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
10000 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
10010 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10020 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
10030 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
10040 20 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70 50   = (PCache *)&pP
10050 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20  ager[1];.  pPtr 
10060 3d 20 28 28 75 38 20 2a 29 26 70 50 61 67 65 72  = ((u8 *)&pPager
10070 5b 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a  [1]) + pcacheSiz
10080 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  e;.  pPager->vfs
10090 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
100a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
100b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
100c0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
100d0 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65  File*0];.  pPage
100e0 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74  r->stfd = (sqlit
100f0 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
10100 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d  Vfs->szOsFile*1]
10110 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
10120 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
10130 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
10140 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67  sFile*2];.  pPag
10150 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
10160 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66  (char*)&pPtr[pVf
10170 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f  s->szOsFile*2+jo
10180 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a  urnalFileSize];.
10190 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
101a0 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
101b0 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
101c0 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ame+1];.  pPager
101d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
101e0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
101f0 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
10200 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
10210 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50 61 74  pVfs;.  if( zPat
10220 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d  hname ){.    mem
10230 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
10240 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
10250 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  , nPathname+1);.
10260 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10270 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
10280 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
10290 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
102a0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
102b0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
102c0 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
102d0 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e    if( nPathname>
102e0 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
102f0 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  e - sizeof("-jou
10300 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20  rnal")) ){.     
10310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
10320 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  TOPEN;.    }else
10330 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74  {.      int fout
10340 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
10350 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
10360 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
10370 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
10380 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
103a0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26  ger->vfsFlags, &
103b0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61  fout);.      rea
103c0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
103d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
103e0 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  LY);..      /* I
103f0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
10400 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
10410 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
10420 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20  e access,.      
10430 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
10440 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
10450 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
10460 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
10470 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
10480 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
10490 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
104a0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
104b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
104c0 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
104d0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
104e0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
104f0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
10500 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
10510 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a  rSize().      **
10520 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
10530 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
10540 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
10550 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
10560 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
10570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10580 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
10590 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72       int iSector
105a0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
105b0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
105c0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
105d0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 69  if( szPageDflt<i
105e0 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  SectorSize ){.  
105f0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
10600 6c 74 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  lt = iSectorSize
10610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  ;.        }.#ifd
10620 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10630 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
10640 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
10650 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
10660 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
10670 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
10680 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
10690 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
106a0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
106b0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
106c0 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
106d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
106e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
106f0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
10700 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
10710 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
10720 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
10730 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
10740 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
10750 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
10760 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
10770 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
10780 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
10790 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
107a0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
107b0 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65 44 66  >>8)) ) szPageDf
107c0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
107d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
107e0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
107f0 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53 51 4c  ( szPageDflt>SQL
10800 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
10810 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
10820 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
10830 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
10840 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
10850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
10870 65 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a  e if( !memDb ){.
10880 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
10890 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
108a0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
108b0 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
108c0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
108d0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
108e0 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
108f0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
10900 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
10910 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
10920 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
10930 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
10940 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20  Write()..    */ 
10950 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
10960 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
10970 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
10980 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69  LUSIVE;.  }..  i
10990 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
109a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
109b0 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
109c0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
109d0 65 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66  eMalloc(szPageDf
109e0 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  lt);.  }..  /* I
109f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10a00 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
10a10 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
10a20 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20  ..  ** Free the 
10a30 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
10a40 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
10a50 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74  le..  ** Since t
10a60 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
10a70 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
10a80 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
10a90 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
10aa0 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
10ab0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
10ac0 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67  !pPager || !pPag
10ad0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  er->pTmpSpace ){
10ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10af0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
10b00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10b10 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10b20 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
10b30 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
10b40 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e  MEM:rc);.  }.  n
10b50 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
10b60 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
10b70 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
10b80 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
10b90 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
10ba0 20 78 44 65 73 63 2c 20 0a 20 20 20 20 20 20 20   xDesc, .       
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
10bc0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
10bd0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
10be0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
10bf0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
10c00 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
10c10 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
10c20 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
10c30 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
10c40 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
10c50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
10c60 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
10c70 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46  lename))..  /* F
10c80 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69  ill in Pager.zDi
10c90 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d  rectory[] */.  m
10ca0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  emcpy(pPager->zD
10cb0 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72  irectory, pPager
10cc0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
10cd0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72  thname+1);.  for
10ce0 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72  (i=strlen(pPager
10cf0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69  ->zDirectory); i
10d00 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
10d10 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
10d20 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
10d30 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
10d40 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
10d50 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
10d60 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
10d70 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  [] */.  if( zPat
10d80 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d  hname ){.    mem
10d90 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
10da0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  rnal, pPager->zF
10db0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
10dc0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
10dd0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
10de0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
10df0 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20  journal", 9);.  
10e00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
10e10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  r->zJournal = 0;
10e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65  .  }..  /* pPage
10e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
10e40 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
10e50 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
10e60 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
10e70 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
10e80 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
10e90 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
10ea0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
10eb0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
10ec0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
10ed0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
10ee0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
10ef0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10f00 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
10f10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
10f20 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f   szPageDflt;.  /
10f30 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
10f40 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
10f50 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
10f60 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
10f70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
10f80 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
10f90 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
10fa0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
10fb0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10fc0 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
10fd0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
10fe0 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
10ff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11000 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
11010 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
11020 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
11030 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
11040 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
11050 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
11060 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
11070 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
11080 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
11090 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
110a0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
110b0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
110c0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
110d0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
110e0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
110f0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
11100 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
11110 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d  lusiveMode = tem
11120 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
11130 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
11140 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
11150 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
11160 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
11170 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
11180 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
11190 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
111a0 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
111b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
111c0 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
111d0 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
111e0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
111f0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
11200 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
11210 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
11220 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11230 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
11240 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
11250 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
11260 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
11270 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50  a = nExtra;.  pP
11280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
11290 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
112a0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
112b0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
112c0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
112d0 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62  >pMethods||memDb
112e0 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ||tempFile);.  i
112f0 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
11300 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
11310 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
11320 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
11330 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
11340 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
11350 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
11360 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
11370 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
11380 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
11390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
113a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
113b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
113c0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
113d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
113e0 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
113f0 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
11400 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
11410 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
11420 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
11430 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
11440 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
11450 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
11460 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
11470 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
11480 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
11490 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
114a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
114b0 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
114c0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
114d0 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
114e0 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
114f0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
11500 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
11510 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
11520 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
11530 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
11540 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
11550 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
11560 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
11570 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
11580 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
11590 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
115a0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
115b0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
115c0 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
115d0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
115e0 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
115f0 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
11600 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  ze to *pPageSize
11610 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74  . If the suggest
11620 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 69   new page size i
11630 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61  s.** inappropria
11640 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
11650 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
11660 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61 74  e is set to that
11670 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65  .** value before
11680 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
11690 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
116a0 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
116b0 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
116c0 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
116d0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
116e0 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d  rCode;.  if( rc=
116f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11700 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
11710 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
11720 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
11730 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
11740 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11750 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11760 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
11770 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
11780 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
11790 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
117a0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65    && (pPager->me
117b0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
117c0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
117d0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
117e0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
117f0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
11800 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
11810 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
11820 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
11830 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
11840 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
11850 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
11860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11880 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
11890 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
118a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
118b0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
118c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
118d0 3e 6d 65 6d 44 62 20 29 20 73 65 74 53 65 63 74  >memDb ) setSect
118e0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
118f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
11900 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
11910 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
11920 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
11930 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
11940 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
11950 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
11960 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
11970 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11980 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
11990 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
119a0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
119c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
119d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
119e0 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
119f0 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
11a00 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
11a10 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
11a20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
11a30 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
11a40 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
11a50 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
11a60 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
11a70 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
11a80 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
11a90 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
11aa0 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
11ab0 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
11ac0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
11ad0 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
11ae0 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
11af0 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
11b00 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
11b10 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
11b20 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
11b30 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
11b40 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
11b50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
11b60 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
11b70 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
11b80 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
11b90 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
11ba0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
11bb0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11bc0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
11bd0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
11be0 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
11bf0 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
11c00 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
11c10 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
11c20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
11c30 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
11c40 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11c50 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
11c60 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
11c70 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
11c80 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
11c90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11ca0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11cc0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
11cd0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
11ce0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11cf0 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
11d00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
11d10 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
11d20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
11d30 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
11d40 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
11d50 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
11d60 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
11d70 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
11d80 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
11d90 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
11da0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
11db0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
11dc0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
11dd0 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
11de0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
11df0 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
11e00 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
11e10 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
11e20 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
11e30 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
11e40 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
11e50 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
11e60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11e70 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
11e80 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11e90 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
11ea0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
11eb0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
11ec0 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
11ed0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
11ee0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11ef0 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
11f00 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
11f10 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
11f20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
11f30 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
11f40 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
11f50 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11f60 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
11f70 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
11f80 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
11f90 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
11fa0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
11fb0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
11fc0 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
11fd0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11fe0 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
11ff0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
12000 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
12010 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12020 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
12030 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
12040 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
12050 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
12060 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
12070 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
12080 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
12090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
120a0 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
120b0 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
120c0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
120d0 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
120e0 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
120f0 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
12100 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
12110 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
12120 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
12130 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
12140 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
12150 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
12160 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
12170 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
12180 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
12190 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
121a0 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
121b0 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
121c0 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
121d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
121e0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
121f0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
12200 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12210 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
12220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12230 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
12240 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45   N);.  assert(ME
12250 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d  MDB||pPager->fd-
12260 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
12270 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12280 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
12290 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
122a0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
122b0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
122c0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
122d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
122e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
122f0 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
12300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
12310 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
12320 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12330 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
12340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12360 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
12370 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
12380 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
12390 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
123a0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
123b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
123c0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
123d0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
123e0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
123f0 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
12400 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
12410 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
12420 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
12430 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
12440 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
12450 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
12460 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
12470 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
12480 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
12490 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
124a0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
124b0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
124c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
124d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
124e0 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
124f0 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
12500 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
12510 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
12520 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12530 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
12540 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
12550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12560 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
12570 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
12580 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
12590 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
125a0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
125b0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
125c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
125d0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
125e0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
125f0 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
12600 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
12610 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
12620 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
12630 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
12640 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
12650 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12670 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
12680 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12690 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
126a0 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
126b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
126c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
126d0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
126e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
126f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
12700 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
12710 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
12720 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
12730 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
12740 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
12750 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
12760 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12770 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
12780 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
12790 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
127a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
127b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
127c0 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
127d0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
127e0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
127f0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
12800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12810 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
12820 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
12830 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
12840 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
12850 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
12860 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
12870 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
12880 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
12890 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
128a0 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
128b0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
128c0 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
128d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
128e0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
128f0 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
12900 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
12910 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
12920 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
12930 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
12940 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
12950 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
12960 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
12970 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
12980 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
12990 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
129a0 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
129b0 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
129c0 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
129d0 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
129e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
129f0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12a00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12a10 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
12a20 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
12a30 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
12a40 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
12a50 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
12a60 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
12a70 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
12a80 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
12a90 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
12aa0 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
12ab0 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
12ac0 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
12ad0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
12ae0 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
12af0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
12b00 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
12b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12b20 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
12b30 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
12b40 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
12b50 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
12b60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12b70 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
12b80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12b90 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
12ba0 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
12bb0 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
12bc0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
12bd0 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
12be0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
12bf0 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
12c00 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
12c10 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
12c20 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
12c30 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
12c40 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
12c50 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
12c60 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
12c70 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
12c80 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
12c90 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
12ca0 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
12cb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
12cc0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12cd0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
12ce0 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20  er->dbSize<0 || 
12cf0 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
12d00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
12d10 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
12d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
12d40 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12d50 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70  dler ) pPager->p
12d60 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75  BusyHandler->nBu
12d70 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b  sy = 0;.    do {
12d80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12d90 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
12da0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
12db0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
12dc0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
12dd0 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
12de0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
12df0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
12e00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12e20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
12e30 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20   locktype;.     
12e40 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
12e50 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
12e60 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
12e70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12e80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
12e90 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
12ea0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
12eb0 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
12ec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12ed0 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
12ee0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
12ef0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
12f00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12f20 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
12f30 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
12f40 0a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ...  sqlite3Page
12f50 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
12f60 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  r, 0);.  if( pPa
12f70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12f80 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
12f90 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
12fa0 65 20 69 66 28 20 6e 50 61 67 65 3c 28 75 6e 73  e if( nPage<(uns
12fb0 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
12fc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
12fd0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
12fe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
12ff0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 61 67  nPage;.      pag
13000 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
13010 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  e(pPager);.    }
13020 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
13030 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
13040 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
13050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13060 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
13070 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13080 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
13090 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
130a0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
130b0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
130c0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
130d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
130e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
130f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13110 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
13120 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
13130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13140 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
13150 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
13160 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13170 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
13180 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
13190 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
131a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
131b0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
131c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
131d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
131e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
131f0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
13200 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
13210 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
13220 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
13230 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
13240 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
13250 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
13260 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
13270 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
13280 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
13290 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
132a0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
132b0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
132c0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
132d0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
132e0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
132f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13300 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
13310 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
13320 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
13330 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13340 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
13350 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
13360 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
13370 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
13380 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
13390 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
133a0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
133b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
133c0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
133d0 67 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65  ger){..  disable
133e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
133f0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
13400 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
13410 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
13420 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
13430 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13440 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
13450 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
13460 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
13470 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
13480 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
13490 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
134a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
134b0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
134c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
134d0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
134e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
134f0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
13500 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
13510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13520 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
13530 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13540 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
13550 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13560 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13570 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73  pInJournal);.  s
13580 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
13590 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  roy(pPager->pAlw
135a0 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  aysRollback);.  
135b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
135c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
135d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
135e0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
135f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13600 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
13610 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
13620 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
13630 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
13640 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
13650 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
13660 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
13670 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
13680 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
13690 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61   */..  sqlite3Pa
136a0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
136b0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
136c0 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
136d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
136e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
136f0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
13700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13710 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
13720 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
13730 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
13740 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
13750 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
13760 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
13770 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
13780 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
13790 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
137a0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
137b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
137c0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
137d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
137e0 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
137f0 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
13800 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
13810 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
13820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13830 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
13840 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
13850 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
13860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13870 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
13880 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
13890 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
138a0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
138b0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
138c0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
138d0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
138e0 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
138f0 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
13900 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
13910 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
13920 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
13930 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13940 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
13950 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
13960 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
13970 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
13980 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
13990 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
139a0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
139b0 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
139c0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
139d0 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
139e0 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
139f0 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
13a00 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
13a10 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
13a20 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
13a30 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
13a40 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
13a50 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
13a60 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
13a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
13a80 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
13a90 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
13aa0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
13ab0 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
13ac0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
13ad0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
13ae0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
13af0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13b00 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
13b10 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
13b20 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
13b30 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
13b40 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
13b50 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
13b60 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
13b70 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
13b80 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
13b90 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
13ba0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
13bb0 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
13bc0 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
13bd0 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
13be0 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
13bf0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
13c00 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
13c10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
13c20 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
13c30 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
13c40 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
13c50 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
13c60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13c70 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
13c80 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
13c90 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
13ca0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
13cb0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
13cc0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
13cd0 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
13ce0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
13cf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
13d00 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
13d10 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
13d20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
13d30 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
13d40 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
13d50 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
13d60 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
13d70 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
13d80 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
13d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13da0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
13db0 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
13dc0 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
13dd0 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
13de0 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
13df0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
13e00 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
13e10 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
13e20 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13e30 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
13e40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13e50 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
13e60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
13e70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
13e80 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
13eb0 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
13ec0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
13ed0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
13ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
13ef0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13f00 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
13f10 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
13f20 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
13f30 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
13f40 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
13f50 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
13f60 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
13f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
13f80 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
13f90 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
13fa0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
13fb0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
13fc0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
13fd0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
13fe0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
13ff0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
14000 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
14010 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
14020 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
14030 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
14040 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
14050 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
14060 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
14070 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14080 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
14090 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
140a0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
140b0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
140c0 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
140d0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
140e0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
140f0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
14100 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
14110 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
14120 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
14130 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
14140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14150 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20  i64 jrnlOff;.   
14160 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
14170 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
14180 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
14190 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
141a0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
141b0 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
141c0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
141d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
141e0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
141f0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
14200 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
14210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14220 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14230 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14240 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  c_flags);.      
14250 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
14260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14270 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72     }..        jr
14280 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
14290 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
142a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
142b0 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c);.        IOTR
142c0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
142d0 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
142e0 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a  , jrnlOff, 4));.
142f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
14300 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
14310 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
14320 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
14330 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
14340 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14350 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
14360 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
14370 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
14380 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
14390 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
143a0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
143b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
143c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
143d0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
143e0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
143f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
14400 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
14410 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
14420 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
14430 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
14440 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
14450 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
14460 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
14470 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
14480 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
14490 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
144a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
144b0 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
144c0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
144d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
144e0 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
144f0 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
14500 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
14510 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
14520 65 33 50 63 61 63 68 65 43 6c 65 61 72 46 6c 61  e3PcacheClearFla
14530 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
14540 68 65 2c 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  he, PGHDR_NEED_S
14550 59 4e 43 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  YNC);.  }..#ifnd
14560 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
14570 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
14580 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
14590 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
145a0 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
145b0 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
145c0 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
145d0 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
145e0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
145f0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
14600 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
14610 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 41    sqlite3PcacheA
14620 73 73 65 72 74 46 6c 61 67 73 28 70 50 61 67 65  ssertFlags(pPage
14630 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50  r->pPCache, 0, P
14640 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
14650 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
14660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14670 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
14680 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
14690 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
146a0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
146b0 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
146c0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
146d0 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
146e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20  tabase file. No 
146f0 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
14700 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  * to the page-ca
14710 63 68 65 20 74 6f 20 6d 61 72 6b 20 74 68 65 20  che to mark the 
14720 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 20  pages as clean. 
14730 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
14740 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
14750 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65  he caller to use
14760 20 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28   PcacheCleanAll(
14770 29 20 6f 72 20 50 63 61 63 68 65 4d 61 6b 65 43  ) or PcacheMakeC
14780 6c 65 61 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a  lean() to mark.*
14790 2a 20 74 68 65 20 70 61 67 65 73 20 61 73 20 63  * the pages as c
147a0 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
147b0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
147c0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
147d0 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
147e0 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
147f0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
14800 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
14810 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
14820 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
14830 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
14840 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
14850 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
14860 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
14870 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
14880 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
14890 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
148a0 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
148b0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
148c0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
148d0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
148e0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
148f0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
14900 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
14910 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
14920 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
14930 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
14940 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
14950 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
14960 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
14970 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
14980 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
14990 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
149a0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
149b0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
149c0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
149d0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
149e0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
149f0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
14a00 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
14a10 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
14a20 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
14a30 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
14a40 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
14a50 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
14a60 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
14a70 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
14a80 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
14a90 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14aa0 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
14ab0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
14ac0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
14ad0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
14ae0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
14af0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
14b00 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14b10 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
14b20 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
14b30 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
14b40 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
14b50 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
14b60 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
14b70 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
14b80 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
14b90 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
14ba0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
14bb0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
14bc0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
14bd0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
14be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14c00 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
14c10 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
14c20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
14c30 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
14c40 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
14c50 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
14c60 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
14c70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14c80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14c90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14ca0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
14cb0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
14cc0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
14cd0 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  fsFlags);.      
14ce0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14cf0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
14d00 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
14d10 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
14d20 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
14d30 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
14d40 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
14d50 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
14d60 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
14d70 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
14d80 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
14d90 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
14da0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
14db0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
14dc0 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
14dd0 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
14de0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
14df0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
14e00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14e10 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
14e20 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
14e30 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
14e40 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
14e50 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
14e60 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
14e70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
14e80 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
14e90 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
14ea0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
14eb0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
14ec0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
14ed0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
14ee0 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
14ef0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
14f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14f10 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
14f20 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
14f30 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
14f40 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
14f50 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
14f60 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
14f70 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
14f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14f90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
14fa0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
14fb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14fc0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
14fd0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
14fe0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
14ff0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
15000 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
15010 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
15020 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
15030 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
15040 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
15050 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
15060 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
15070 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
15080 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
15090 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
150a0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
150b0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
150c0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
150d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
150e0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
150f0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
15100 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
15110 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
15120 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
15130 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
15140 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
15150 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
15160 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
15170 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
15180 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
15190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
151a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
151b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
151c0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
151d0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
151e0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
151f0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
15200 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
15210 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
15220 75 72 67 65 61 62 6c 65 20 50 61 67 65 72 20 0a  urgeable Pager .
15230 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
15240 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
15250 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67  s to make a sing
15260 6c 65 20 64 69 72 74 79 20 70 61 67 65 20 74 68  le dirty page th
15270 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74  at has no.** out
15280 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
15290 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78 69 73  ces (if one exis
152a0 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74 68 61  ts) clean so tha
152b0 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 63 79  t it can be recy
152c0 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  cled .** by the 
152d0 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f  pcache layer..*/
152e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
152f0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
15300 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
15310 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15320 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
15330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15340 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15350 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20  >doNotSync ){.  
15360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15370 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
15380 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
15390 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 69  HDR_DIRTY );.  i
153a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
153b0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
153c0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
153d0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
153e0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20  YNC ){.      rc 
153f0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
15400 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
15410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15420 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
15430 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21  nc && .        !
15440 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
15450 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
15460 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
15470 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
15480 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20  PEND).      ){. 
15490 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
154a0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
154b0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
154c0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
154d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
154e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
154f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
15500 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
15510 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
15520 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
15530 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
15540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15550 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
15560 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
15570 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15590 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
155a0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
155b0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
155c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
155d0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
155e0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
155f0 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
15600 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
15610 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
15620 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
15630 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
15640 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
15650 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
15660 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
15670 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
15680 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
15690 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
156a0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
156b0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
156c0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
156d0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
156e0 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
156f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
15700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  *.** Return nega
15710 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74  tive if unable t
15720 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
15730 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f  status of the jo
15740 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
15750 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
15760 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ot open the jour
15770 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  nal file to exam
15780 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65  ine its.** conte
15790 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  nt.  Hence, the 
157a0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
157b0 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
157c0 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  f a master.** jo
157d0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
157e0 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
157f0 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20  , and hence not 
15800 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74  be hot.  Or.** t
15810 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
15820 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62   journal might b
15830 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54  e zeroed out.  T
15840 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
15850 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72  oes not discover
15860 20 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20   these cases of 
15870 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61  a non-hot journa
15880 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f  l - if the.** jo
15890 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
158a0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70  s and is not emp
158b0 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ty this routine 
158c0 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73  assumes it.** is
158d0 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72   hot.  The pager
158e0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
158f0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
15900 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f  r that the.** jo
15910 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
15920 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
15930 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   will no-op..*/.
15940 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
15950 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
15960 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
15970 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
15980 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
15990 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
159a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
159b0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20  .  int exists;. 
159c0 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61   int locked;.  a
159d0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
159e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
159f0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
15a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15a10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15a20 64 73 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73  ds );.  *pExists
15a30 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
15a40 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
15a50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15a60 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
15a70 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
15a80 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
15a90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
15aa0 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ts ){.    rc = s
15ab0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
15ac0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
15ad0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
15ae0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15af0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
15b00 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  s && !locked ){.
15b10 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
15b20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15b30 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15b40 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
15b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28  E_OK ){.     if(
15b70 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
15b80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
15b90 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
15ba0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
15bb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15bc0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
15bd0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15be0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15bf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
15c00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
15c10 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
15c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15c30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15c40 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
15c50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15c60 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
15c70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
15c80 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
15c90 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
15ca0 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
15cb0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
15cc0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15cd0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
15ce0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
15cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15d00 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
15d10 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
15d20 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
15d30 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
15d40 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
15d50 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15d60 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
15d70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15d80 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50  ze, offset);.  P
15d90 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
15da0 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
15db0 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
15dc0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
15dd0 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
15de0 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
15df0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
15e00 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
15e10 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15e20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15e30 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
15e40 61 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  a)[24],.        
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
15e80 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
15e90 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
15ea0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
15eb0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
15ec0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
15ed0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
15ee0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
15ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15f00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
15f10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67  , pPg->pgno, pag
15f20 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
15f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15f40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
15f50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15f60 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
15f70 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
15f80 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
15f90 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
15fa0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
15fb0 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
15fc0 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
15fd0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
15fe0 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
15ff0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16000 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
16010 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
16020 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
16030 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
16040 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16050 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
16060 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
16070 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
16080 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
16090 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
160a0 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
160b0 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
160c0 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
160d0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
160e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
160f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16100 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30  isErrorReset = 0
16110 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
16120 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16130 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
16140 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
16150 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
16160 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
16170 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
16180 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
16190 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
161a0 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
161b0 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
161c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
161d0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
161e0 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
161f0 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
16200 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
16210 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
16220 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
16230 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
16240 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
16250 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
16260 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
16270 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
16280 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69  Code .  ){.    i
16290 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
162a0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
162b0 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
162c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
162d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
162e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
162f0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
16300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16310 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
16320 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
16330 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
16340 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
16350 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
16360 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
16370 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
16380 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
16390 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
163a0 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
163b0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
163c0 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
163d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
163e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
163f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
16400 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
16410 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
16420 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
16430 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
16440 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
16450 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
16460 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
16470 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
16480 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
16490 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
164a0 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
164b0 72 6e 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  rnal;.      asse
164c0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
164d0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
164e0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
164f0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
16500 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
16510 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
16520 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16530 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
16540 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
16570 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16580 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
16590 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CK );.          
165a0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
165b0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
165c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
165e0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
165f0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
16600 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
16610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
16620 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
16630 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
16640 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
16650 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16660 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
16670 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
16680 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
16690 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
166a0 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f       if( !isErro
166b0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
166c0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
166d0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
166e0 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
166f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16710 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
16720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16730 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 45   }.      if( isE
16740 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
16750 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
16760 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
16770 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16790 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
167a0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20  t it is.        
167b0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
167c0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
167d0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
167e0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
167f0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45  the.        ** E
16800 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
16810 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
16820 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
16830 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
16840 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16850 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16860 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
16870 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
16880 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
16890 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
168a0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
168b0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
168c0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
168d0 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e          ** back.
168e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
168f0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
16900 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
16910 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16920 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
16930 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16940 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
16950 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
16960 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
16970 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
16980 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
16990 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
169a0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
169b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
169c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
169d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
169e0 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
169f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
16a00 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16a10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16a20 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16a30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
16a60 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16a70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
16a80 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
16a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
16ab0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
16ac0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
16ad0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
16ae0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16af0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
16b00 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
16b10 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
16b20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
16b30 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
16b40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
16b50 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
16b60 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
16b70 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
16b80 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
16b90 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
16ba0 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
16bb0 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
16bc0 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
16bd0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
16be0 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
16bf0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
16c00 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
16c10 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
16c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16c30 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
16c40 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t && pPager->jou
16c50 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  rnalOpen==0 ){. 
16c60 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73           int res
16c70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16c80 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
16c90 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
16ca0 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
16cb0 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
16cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
16cf0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
16d00 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
16d10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
16d20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
16d30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16d40 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
16d50 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
16d60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16d70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16d80 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16da0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
16db0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
16dc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
16dd0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
16de0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
16df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
16e00 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
16e10 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
16e20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51       if( fout&SQ
16e30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16e40 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
16e50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16e60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16e80 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
16e90 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
16ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ec0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16ed0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
16ee0 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
16ef0 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
16f00 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
16f10 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
16f20 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
16f30 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
16f40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16f50 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
16f60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
16f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
16fb0 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
16fc0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20  TE_IOERR_UNLOCK 
16fd0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72  .           && r
16fe0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
16ff0 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 20  NOMEM .         
17000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17010 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17020 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17030 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
17040 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
17050 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
17060 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
17070 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17080 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
17090 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
170a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
170b0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
170c0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
170d0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
170e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
170f0 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
17100 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
17110 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
17120 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
17130 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
17140 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
17150 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
17160 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
17170 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
17180 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
17190 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
171a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
171b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
171c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
171d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
171e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
171f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
17200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
17210 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17220 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
17230 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
17240 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17250 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
17260 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
17270 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17280 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
17290 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
172a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
172b0 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
172c0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
172d0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
172e0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
172f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17300 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
17310 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
17320 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
17330 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
17340 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
17350 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
17360 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
17370 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17380 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
17390 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
173a0 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
173b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
173c0 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
173d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
173e0 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
173f0 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
17400 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
17410 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
17420 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
17430 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
17440 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
17450 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
17460 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
17470 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
17480 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
17490 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
174a0 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
174b0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
174c0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
174d0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
174e0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
174f0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
17500 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
17510 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
17520 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
17530 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
17540 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
17550 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
17560 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
17570 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
17580 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
17590 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
175a0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
175b0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
175c0 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
175d0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
175e0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
175f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
17600 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
17610 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17620 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
17630 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17640 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
17650 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  0);..        if(
17660 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17680 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17690 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  de;.          go
176a0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
176b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
176c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
176d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
176e0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
176f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17700 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
17710 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
17720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17730 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17740 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
17750 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17760 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
17770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17790 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
177a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
177b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
177c0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
177d0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
177e0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
177f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17800 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
17810 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17820 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
17830 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
17840 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
17850 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17860 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
17870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17880 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17890 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
178a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
178b0 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
178c0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
178d0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
178e0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
178f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
17900 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
17910 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64    }.  }.. failed
17920 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
17930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
17940 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
17950 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78  s a no-op for ex
17960 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
17970 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
17980 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ases. */.    pag
17990 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
179a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
179b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
179c0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
179d0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
179e0 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
179f0 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
17a00 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
17a10 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
17a20 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
17a30 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
17a40 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
17a50 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
17a60 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
17a70 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
17a80 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
17a90 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
17aa0 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
17ab0 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
17ac0 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
17ad0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
17ae0 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
17af0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
17b00 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
17b10 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
17b20 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
17b30 45 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69  ED_READ ){.    i
17b40 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
17b50 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
17b60 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
17b70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17b90 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
17ba0 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
17bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17bd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17be0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17bf0 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
17c00 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
17c10 61 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20  ached zero, and 
17c20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
17c30 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c   in the.** middl
17c40 65 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61  e of a write tra
17c50 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e  nsaction or open
17c60 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ed in exclusive 
17c70 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e  mode, unlock it.
17c80 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
17c90 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
17ca0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
17cb0 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
17cc0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
17cd0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
17ce0 65 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21  e)==0).    && (!
17cf0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17d00 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
17d10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
17d20 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
17d30 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
17d40 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
17d50 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67  /*.** Drop a pag
17d60 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  e from the cache
17d70 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63   using sqlite3Pc
17d80 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a  acheDrop()..**.*
17d90 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  * If this means 
17da0 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  there are now no
17db0 20 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65   pages with refe
17dc0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20  rences to them, 
17dd0 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
17de0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
17df0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17e00 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  e is removed..*/
17e10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
17e20 65 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67  erDropPage(DbPag
17e30 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
17e40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
17e50 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
17e60 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
17e70 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  ;.  pagerUnlockI
17e80 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
17e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
17ea0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
17eb0 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
17ec0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
17ed0 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
17ee0 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
17ef0 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
17f00 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
17f10 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
17f20 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
17f30 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
17f40 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
17f50 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
17f60 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
17f70 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
17f80 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
17f90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
17fa0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
17fb0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
17fc0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
17fd0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
17fe0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
17ff0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
18000 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
18010 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
18020 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
18030 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
18040 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
18050 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
18060 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
18070 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
18080 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
18090 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
180a0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
180b0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
180c0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
180d0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
180e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
180f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
18100 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
18110 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
18120 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18130 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
18140 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
18150 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
18160 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
18170 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
18180 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
18190 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
181a0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
181b0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
181c0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
181d0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
181e0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
181f0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
18200 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
18210 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
18220 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
18230 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
18240 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
18250 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
18260 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
18270 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
18280 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
18290 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
182a0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
182b0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
182c0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
182d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
182e0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
182f0 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
18300 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
18310 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
18320 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
18330 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
18340 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
18350 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
18360 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
18370 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
18380 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
18390 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
183a0 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
183b0 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
183c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
183d0 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
183e0 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
183f0 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
18400 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
18410 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
18420 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
18430 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
18440 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
18450 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
18460 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
18470 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
18480 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
18490 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
184a0 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
184b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
184c0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
184d0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
184e0 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
184f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
18500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
18510 20 70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20   pagerAcquire(. 
18520 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
18530 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
18540 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
18550 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
18560 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
18570 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
18580 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
18590 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
185a0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
185b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
185c0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
185d0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
185e0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
185f0 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
18600 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
18610 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
18620 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
18630 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18640 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18650 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
18660 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
18670 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
18680 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
18690 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67  >0 .       || pg
186a0 6e 6f 3d 3d 31 20 0a 20 20 29 3b 0a 0a 20 20 2f  no==1 .  );..  /
186b0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
186c0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
186d0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
186e0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
186f0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
18700 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
18710 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
18720 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
18730 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
18740 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
18750 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
18760 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18770 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18790 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
187a0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
187b0 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
187c0 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
187d0 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
187e0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
187f0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Page = 0;..  /* 
18800 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
18810 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
18820 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
18830 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
18840 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18850 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
18860 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
18870 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
18880 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
18890 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
188a0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
188b0 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
188c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
188d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
188e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
188f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18900 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
18910 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  K );..  rc = sql
18920 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
18930 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
18940 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b   pgno, 1, &pPg);
18950 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18970 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
18980 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
18990 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
189a0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
189b0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
189c0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
189d0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
189e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
189f0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d     */.    int nM
18a00 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ax;.    PAGER_IN
18a10 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
18a20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
18a30 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
18a40 20 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76   if( sqlite3Bitv
18a50 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
18a60 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
18a70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
18a80 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
18a90 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
18aa0 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
18ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
18ac0 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61 2c 20  et(pPg->pExtra, 
18ad0 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
18ae0 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  a);..    rc = sq
18af0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18b00 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
18b10 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
18b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
18b40 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
18b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18b60 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  }..    if( nMax<
18b70 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
18b80 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  DB || noContent 
18b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
18ba0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
18bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18bc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
18bd0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
18be0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
18bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
18c00 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
18c10 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
18c20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
18c30 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
18c40 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
18c50 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 52   |= PGHDR_NEED_R
18c60 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EAD;.      }.   
18c70 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
18c80 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
18c90 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
18ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18cb0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61  = readDbPage(pPa
18cc0 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b  ger, pPg, pgno);
18cd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18ce0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
18cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18d00 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
18d10 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50 61 67     /* sqlite3Pag
18d20 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f  erUnref(pPg); */
18d30 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 44 72  .        pagerDr
18d40 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  opPage(pPg);.   
18d50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
18d70 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
18d80 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
18d90 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
18da0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
18db0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18dc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
18dd0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
18de0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18df0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 73   */.    assert(s
18e00 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
18e10 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
18e20 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d  ache)>0 || pgno=
18e30 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  =1);.    PAGER_I
18e40 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
18e50 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f  );.    if( !noCo
18e60 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
18e70 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
18e80 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20  ntent(pPg);.    
18e90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18ea0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18eb0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18ec0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18ee0 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ..  *ppPage = pP
18ef0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
18f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71  TE_OK;.}..int sq
18f10 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
18f20 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
18f30 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
18f40 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
18f50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18f60 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
18f70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
18f80 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
18f90 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
18fa0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
18fb0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
18fc0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
18fd0 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
18fe0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
18ff0 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
19000 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
19010 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
19020 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
19030 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70 50   pagerAcquire(pP
19040 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
19050 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
19060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19070 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
19080 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
19090 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
190a0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
190b0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
190c0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
190d0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
190e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
190f0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
19100 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
19110 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
19120 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
19130 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
19140 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
19150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
19160 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
19170 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
19180 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
19190 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
191a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
191b0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
191c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
191d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
191e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
191f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
19200 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
19210 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
19220 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
19230 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
19240 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
19250 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
19260 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19270 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
19280 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
19290 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
192a0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
192b0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50  =0 );..  if( (pP
192c0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
192d0 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26  ER_UNLOCK).   &&
192e0 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
192f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
19300 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
19310 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20  =SQLITE_FULL).  
19320 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
19330 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
19340 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
19350 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a   0, &pPg);.  }..
19360 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
19370 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
19380 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
19390 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
193a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
193b0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
193c0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
193d0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
193e0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
193f0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
19400 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
19410 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
19420 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
19430 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
19440 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19450 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
19460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19470 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
19480 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
19490 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
194a0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
194b0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
194c0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
194d0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
194e0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
194f0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19510 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
19520 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
19530 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
19540 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
19550 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
19560 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
19570 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19580 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
19590 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
195a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
195b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
195c0 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
195d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
195e0 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
195f0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
19600 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
19610 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19620 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
19630 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
19640 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
19650 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19660 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
19670 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19680 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
19690 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
196a0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
196b0 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
196c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
196d0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
196e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
196f0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19710 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
19720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19730 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
19740 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
19750 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
19760 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61 67  ager, 0);.  pPag
19770 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
19780 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
19790 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
197a0 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ize);.  if( pPag
197b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
197c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
197d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
197e0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
197f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
19800 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19810 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
19820 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
19830 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
19840 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51      flags |= (SQ
19850 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
19860 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
19870 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
19880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19890 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51      flags |= (SQ
198a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
198b0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 23  OURNAL);.    }.#
198c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
198d0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
198e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
198f0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
19900 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
19910 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
19920 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
19930 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
19940 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a  (pPager).    );.
19950 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
19960 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19970 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
19980 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
19990 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
199a0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
199b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
199c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
199d0 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50  ethods );.    pP
199e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
199f0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
19a00 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
19a10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
19a20 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
19a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
19a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
19a60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19a70 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19a80 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
19a90 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
19aa0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
19ab0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
19ac0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  l;.    }.  }.  p
19ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19ae0 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
19af0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
19b00 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19b10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
19b20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
19b30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
19b40 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
19b50 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
19b60 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
19b70 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
19b80 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
19b90 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
19ba0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
19bb0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
19bc0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
19bd0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
19be0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
19bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19c00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19c10 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
19c20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
19c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19c40 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
19c50 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
19c60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
19c70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
19c80 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
19c90 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
19ca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19cb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19cc0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
19cd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19ce0 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
19cf0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
19d00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
19d10 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
19d20 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
19d30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
19d40 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
19d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
19d60 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
19d70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
19d80 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
19d90 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
19da0 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
19db0 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
19dc0 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
19dd0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
19de0 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64  eTwo() is called
19df0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
19e00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
19e10 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
19e20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19e30 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
19e40 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
19e50 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
19e60 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
19e70 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
19e80 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
19e90 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
19ea0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
19eb0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
19ec0 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
19ed0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
19ee0 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
19ef0 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
19f00 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
19f10 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
19f20 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
19f30 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
19f40 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
19f50 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
19f60 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
19f70 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
19f80 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
19f90 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
19fa0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
19fb0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
19fc0 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
19fd0 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
19fe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19ff0 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
1a000 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
1a010 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
1a020 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
1a030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a040 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
1a050 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
1a060 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
1a070 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
1a080 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
1a090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a0a0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
1a0b0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
1a0c0 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
1a0d0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
1a0e0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1a0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1a100 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
1a110 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
1a120 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a130 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1a140 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
1a150 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
1a160 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1a170 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
1a180 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
1a190 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
1a1a0 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
1a1b0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
1a1c0 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
1a1d0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
1a1e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1a1f0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
1a200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1a210 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
1a220 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
1a230 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1a240 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1a250 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a260 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1a270 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
1a280 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a290 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1a2a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
1a2b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1a2c0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
1a2d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a2e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1a2f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1a300 63 61 63 68 65 41 73 73 65 72 74 46 6c 61 67 73  cacheAssertFlags
1a310 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1a320 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  , 0, PGHDR_IN_JO
1a330 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20  URNAL);.    if( 
1a340 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
1a350 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1a360 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1a370 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
1a380 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1a390 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
1a3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1a3b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1a3c0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1a3d0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
1a3e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1a400 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1a410 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
1a420 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
1a430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1a440 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1a450 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1a460 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1a470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a480 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a4a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1a4c0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1a4d0 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1a4e0 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1a4f0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1a500 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1a510 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1a520 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1a530 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1a540 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
1a550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1a560 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1a570 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1a580 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a590 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1a5a0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
1a5b0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1a5c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a5d0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  pen && pPager->j
1a5e0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
1a5f0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
1a600 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
1a610 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
1a620 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1a630 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  the last.    ** 
1a640 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
1a650 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
1a660 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
1a670 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
1a680 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
1a690 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
1a6a0 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
1a6b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
1a6c0 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
1a6d0 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65  t open and eithe
1a6e0 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  r was truncated 
1a6f0 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74  to 0 bytes or it
1a700 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20  s header was.   
1a710 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20   ** overwritten 
1a720 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
1a730 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1a740 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
1a750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1a760 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a770 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1a780 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1a790 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1a7a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1a7b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
1a7c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
1a7d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1a7e0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 20  e3BitvecCreate( 
1a7f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1a800 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1a810 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->pInJournal ){
1a820 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1a840 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1a850 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1a860 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1a870 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1a880 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1a890 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1a8a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1a8b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1a8c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a8d0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
1a8e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1a8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a900 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
1a910 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
1a920 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
1a930 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
1a940 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1a950 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
1a960 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
1a970 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1a980 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
1a990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1a9a0 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
1a9b0 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
1a9c0 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
1a9d0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
1a9e0 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
1a9f0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1aa00 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
1aa10 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1aa20 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
1aa30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  ;.}.../*.** Mark
1aa40 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
1aa50 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
1aa60 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
1aa70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1aa80 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
1aa90 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1aaa0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1aab0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
1aac0 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
1aad0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
1aae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1aaf0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1ab00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1ab10 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
1ab20 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
1ab30 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
1ab40 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1ab50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1ab60 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
1ab70 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
1ab80 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
1ab90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1aba0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
1abb0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1abc0 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
1abd0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
1abe0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
1abf0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
1ac00 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
1ac10 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
1ac20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ac30 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1ac40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
1ac50 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
1ac60 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
1ac70 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
1ac80 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
1ac90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1aca0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
1acb0 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
1acc0 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
1acd0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
1ace0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
1acf0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
1ad00 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
1ad10 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
1ad20 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
1ad30 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
1ad40 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1ad50 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
1ad60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ad70 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
1ad80 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
1ad90 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1ada0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
1adb0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1adc0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1add0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1ade0 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
1adf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1ae00 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
1ae10 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1ae20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1ae30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
1ae40 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
1ae50 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
1ae60 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1ae70 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1ae80 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
1ae90 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1aea0 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
1aeb0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
1aec0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1aed0 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
1aee0 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
1aef0 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
1af00 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1af10 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
1af20 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
1af30 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
1af40 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
1af50 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
1af60 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
1af70 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
1af80 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
1af90 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
1afa0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1afb0 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
1afc0 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
1afd0 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
1afe0 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
1aff0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
1b000 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
1b010 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b020 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
1b030 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
1b040 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
1b050 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1b060 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
1b070 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1b080 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1b090 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1b0a0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1b0b0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1b0c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1b0d0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1b0e0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1b0f0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1b100 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
1b110 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 28 70  y(pPg);.  if( (p
1b120 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1b130 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 26  IN_JOURNAL).   &
1b140 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & (pageInStateme
1b150 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65  nt(pPg) || pPage
1b160 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
1b170 20 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65   .  ){.    pPage
1b180 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1b190 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  1;.    pPager->d
1b1a0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
1b1b0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
1b1c0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
1b1d0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
1b1e0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
1b1f0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
1b200 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
1b210 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1b220 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
1b230 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
1b240 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
1b250 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
1b260 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
1b270 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b280 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1b290 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
1b2a0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
1b2b0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1b2c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b2d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1b2e0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
1b2f0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1b300 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
1b310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b330 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1b340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b350 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1b360 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
1b370 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1b380 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1b390 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
1b3a0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1b3b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1b3c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1b3d0 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
1b3e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1b3f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b410 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1b430 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1b440 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1b450 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
1b460 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1b470 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1b480 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1b490 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1b4a0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1b4b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b4c0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1b4d0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1b4e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1b4f0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1b500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1b510 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1b520 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1b530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b540 21 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  !(pPg->flags&PGH
1b550 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 26  DR_IN_JOURNAL) &
1b560 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  & (pPager->journ
1b570 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42 29  alOpen || MEMDB)
1b580 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1b590 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1b5a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b5b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
1b5c0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1b5d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1b5e0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1b5f0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1b600 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1b610 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1b620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1b630 68 65 50 72 65 73 65 72 76 65 28 70 50 67 2c 20  hePreserve(pPg, 
1b640 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
1b650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1b670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1b690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
1b6a0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
1b6b0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1b6c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1b6d0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
1b6e0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1b6f0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
1b700 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
1b710 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1b720 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
1b730 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1b740 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
1b750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
1b760 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
1b770 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b780 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
1b790 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1b7a0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
1b7b0 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
1b7c0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1b7d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1b7e0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
1b7f0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1b800 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1b810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1b820 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1b830 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b840 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1b850 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1b860 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b890 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1b8a0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
1b8b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1b8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b8f0 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
1b900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b910 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
1b920 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
1b930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b940 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b960 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
1b970 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1b980 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
1b990 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
1b9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1b9b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b9c0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
1b9d0 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  }.          IOTR
1b9e0 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
1b9f0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
1ba00 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
1ba10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1ba30 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
1ba40 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
1ba50 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1ba60 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
1ba70 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
1ba80 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ba90 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
1baa0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1bab0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
1bac0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bad0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1bae0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1bb00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1bb10 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1bb20 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1bb30 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20  (pPg));..       
1bb40 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
1bb50 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1bb60 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1bb70 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1bb80 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1bb90 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
1bba0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
1bbb0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
1bbc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bbd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bbe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bbf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1bc00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1bc10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bc20 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
1bc30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bc40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
1bc50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1bc60 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1bc70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1bc80 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1bc90 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
1bca0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1bcb0 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e             pPg->
1bcc0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1bcd0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1bce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1bcf0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1bd00 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
1bd10 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
1bd20 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
1bd30 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
1bd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1bd50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bd60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1bd70 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1bd80 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
1bd90 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1bda0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
1bdb0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
1bdc0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
1bdd0 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
1bde0 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
1bdf0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
1be00 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
1be10 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1be20 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1be30 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
1be40 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
1be50 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1be60 43 29 3f 31 3a 30 29 29 3b 0a 20 20 20 20 20 20  C)?1:0));.      
1be70 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1be80 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1be90 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
1bea0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1beb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
1bec0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
1bed0 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55   |= PGHDR_IN_JOU
1bee0 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  RNAL;.    }.  . 
1bef0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
1bf00 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
1bf10 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
1bf20 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
1bf30 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
1bf40 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1bf50 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
1bf60 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
1bf70 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
1bf80 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1bf90 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
1bfa0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
1bfb0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
1bfc0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
1bfd0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
1bfe0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
1bff0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
1c000 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1c010 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20  er->stmtInUse . 
1c020 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74      && !pageInSt
1c030 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20  atement(pPg) .  
1c040 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
1c050 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1c060 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20  mtSize .    ){. 
1c070 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
1c080 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 49  g->flags&PGHDR_I
1c090 4e 5f 4a 4f 55 52 4e 41 4c 29 20 0a 20 20 20 20  N_JOURNAL) .    
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1c0b0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1c0c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c0d0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
1c0e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1c0f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1c100 68 65 50 72 65 73 65 72 76 65 28 70 50 67 2c 20  hePreserve(pPg, 
1c110 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1c120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c130 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c140 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1c150 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c160 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1c170 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c180 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c190 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c1b0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c1c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c1d0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1c1e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
1c1f0 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
1c200 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1c210 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1c220 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1c230 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1c240 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
1c250 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c260 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c290 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1c2a0 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >stfd, pData2, p
1c2b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1c2c0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
1c2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1c2e0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1c2f0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c300 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c310 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c320 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1c330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c340 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c350 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1c360 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c370 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
1c380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c390 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29  er->pInStmt!=0 )
1c3a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c3b0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
1c3c0 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
1c3d0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
1c3e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c3f0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1c400 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1c410 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1c420 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c430 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1c440 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1c450 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1c460 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1c470 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1c480 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1c490 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1c4a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1c4b0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1c4c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1c4d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c4e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1c4f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c500 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c510 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1c520 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1c530 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1c540 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1c550 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1c560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1c570 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1c580 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1c590 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1c5a0 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1c5b0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1c5c0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1c5d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c5e0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1c5f0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1c600 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1c610 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1c620 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1c630 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1c640 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1c650 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1c660 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1c670 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1c680 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1c690 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1c6a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1c6b0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1c6c0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1c6d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1c6e0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1c6f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c700 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1c710 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1c720 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c730 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1c740 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1c750 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1c760 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1c770 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1c780 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
1c790 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
1c7a0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
1c7b0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
1c7c0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c7d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1c7e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c7f0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
1c800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c810 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1c820 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1c830 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
1c840 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1c850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c860 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1c870 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
1c880 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
1c890 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
1c8a0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
1c8b0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
1c8c0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
1c8d0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
1c8e0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
1c8f0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
1c900 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
1c910 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
1c920 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
1c930 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
1c940 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
1c950 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c960 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1c970 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1c980 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1c990 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1c9a0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1c9b0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1c9c0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1c9d0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1c9e0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1c9f0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1ca00 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1ca10 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1ca20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1ca30 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1ca40 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1ca50 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1ca60 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1ca70 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1ca80 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1ca90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1caa0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1cab0 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
1cac0 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
1cad0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1cae0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1caf0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1cb00 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1cb10 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1cb20 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
1cb30 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1cb40 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1cb50 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
1cb60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1cb70 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
1cb80 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
1cb90 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
1cba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
1cbb0 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
1cbc0 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
1cbd0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
1cbe0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1cbf0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
1cc00 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
1cc10 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
1cc20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
1cc30 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
1cc40 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
1cc50 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
1cc60 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
1cc70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
1cc80 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
1cc90 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
1cca0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1ccb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ccc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1ccd0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1cce0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1ccf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1cd10 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1cd20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1cd30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
1cd40 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1cd50 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
1cd60 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
1cd70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1cd80 7d 0a 20 20 20 20 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 20 20  pPage);.        
1cdb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1cdc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1cdd0 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
1cde0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
1cdf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
1ce00 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
1ce10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1ce20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
1ce30 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1ce40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1ce50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1ce60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1ce70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1ce80 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
1ce90 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  nc flag is set f
1cea0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
1ceb0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
1cec0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
1ced0 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
1cee0 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
1cef0 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
1cf00 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
1cf10 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
1cf20 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
1cf30 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
1cf40 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
1cf50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
1cf60 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
1cf70 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
1cf80 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
1cf90 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
1cfa0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
1cfb0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
1cfc0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1cfd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
1cfe0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1cff0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
1d000 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
1d010 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
1d020 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
1d030 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29   needSync; ii++)
1d040 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
1d050 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
1d060 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1d070 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
1d080 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65  f( pPage ) pPage
1d090 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
1d0a0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
1d0b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1d0c0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1d0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1d0e0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
1d0f0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
1d100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d110 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
1d120 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
1d130 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
1d140 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
1d150 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
1d160 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1d170 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1d180 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1d190 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
1d1a0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
1d1b0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
1d1c0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
1d1d0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
1d1e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1d1f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
1d200 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
1d210 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
1d220 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
1d230 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
1d240 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
1d250 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
1d260 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
1d270 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d280 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
1d290 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
1d2a0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1d2b0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1d2c0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
1d2d0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
1d2e0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
1d2f0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
1d300 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
1d310 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
1d320 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
1d330 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
1d340 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
1d350 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
1d360 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
1d370 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
1d380 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
1d390 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
1d3a0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
1d3b0 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
1d3c0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
1d3d0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
1d3e0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
1d3f0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
1d400 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
1d410 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
1d420 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
1d430 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
1d440 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1d450 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1d460 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1d470 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1d480 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1d490 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1d4a0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1d4b0 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1d4c0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1d4d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d4e0 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1d4f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1d500 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1d510 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1d520 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
1d530 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1d540 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1d550 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1d560 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1d570 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1d580 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1d590 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1d5a0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1d5b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1d5c0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1d5d0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1d5e0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1d5f0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1d600 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1d610 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1d620 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1d630 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1d640 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1d650 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1d660 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1d670 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1d680 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1d690 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1d6a0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1d6b0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1d6c0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1d6d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d6e0 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
1d6f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1d700 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
1d710 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
1d720 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
1d730 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
1d740 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
1d750 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1d760 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
1d770 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
1d780 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1d790 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1d7a0 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
1d7b0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1d7c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d7d0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1d7e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44   rc;..  if( MEMD
1d7f0 42 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  B || pPg->pgno>p
1d800 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1d810 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
1d820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
1d840 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20  waysRollback==0 
1d850 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d860 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1d870 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
1d880 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1d890 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1d8a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6f  Create(pPager->o
1d8b0 72 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20 20  rigDbSize);.    
1d8c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c  if( !pPager->pAl
1d8d0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
1d8e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d8f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1d900 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1d910 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1d920 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
1d930 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  back, pPg->pgno)
1d940 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1d950 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d 3e  ITE_OK && (pPg->
1d960 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
1d970 59 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  Y) && !pPager->s
1d980 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1d990 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d9a0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1d9b0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1d9c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1d9d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
1d9e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1d9f0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
1da00 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
1da10 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
1da20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1da30 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
1da40 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
1da50 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
1da60 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1da70 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
1da80 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
1da90 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
1daa0 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
1dab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
1dac0 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
1dad0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1dae0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
1daf0 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
1db00 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
1db10 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
1db20 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
1db30 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
1db40 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
1db50 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
1db60 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
1db70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
1db80 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
1db90 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
1dba0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
1dbb0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
1dbc0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
1dbd0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
1dbe0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
1dbf0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1dc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc10 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
1dc20 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
1dc30 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1dc40 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1dc50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
1dc60 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
1dc70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1dc80 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
1dc90 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1dca0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1dcb0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1dcc0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1dcd0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1dce0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1dcf0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1dd00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1dd10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
1dd20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1dd30 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1dd40 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1dd50 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1dd60 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1dd70 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1dd80 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1dd90 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1dda0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1ddb0 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1ddc0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1ddd0 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1dde0 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1ddf0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1de00 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
1de10 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
1de20 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
1de30 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
1de40 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
1de50 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
1de60 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
1de70 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
1de80 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
1de90 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
1dea0 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
1deb0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
1dec0 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
1ded0 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
1dee0 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
1def0 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
1df00 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1df10 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1df20 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1df30 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1df40 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1df50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1df60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1df70 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
1df80 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1df90 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  l file is not op
1dfa0 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65  en, or DontWrite
1dfb0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1dfc0 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20  ed on.  ** this 
1dfd0 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28  page (DontWrite(
1dfe0 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79  ) sets the alway
1dff0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c  sRollback flag),
1e000 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
1e010 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1e020 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1e030 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e040 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71  pen==0 .   || sq
1e050 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
1e060 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1e070 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67  ollback, pPg->pg
1e080 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70  no).   || pPg->p
1e090 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1e0a0 44 62 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20 20  DbSize.  ){.    
1e0b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
1e0c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 20  sert( !MEMDB ); 
1e0d0 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d 64     /* For a memd
1e0e0 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  b, pPager->journ
1e0f0 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79 73  alOpen is always
1e100 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   0 */..#ifdef SQ
1e110 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1e120 54 45 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  TE.  if( (pPg->f
1e130 6c 61 67 73 20 26 20 50 47 48 44 52 5f 49 4e 5f  lags & PGHDR_IN_
1e140 4a 4f 55 52 4e 41 4c 29 21 3d 30 20 7c 7c 20 28  JOURNAL)!=0 || (
1e150 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
1e160 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e180 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1e190 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54   If SECURE_DELET
1e1a0 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  E is disabled, t
1e1b0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
1e1c0 77 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  way that this.  
1e1d0 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  ** routine can b
1e1e0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  e called on a pa
1e1f0 67 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c  ge for which sql
1e200 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
1e210 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  te().  ** has no
1e220 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
1e230 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  y called during 
1e240 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
1e250 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69  tion..  ** And i
1e260 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  f DontWrite() ha
1e270 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65  s previously bee
1e280 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f  n called, the fo
1e290 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e  llowing.  ** con
1e2a0 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
1e2b0 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  met..  **.  ** (
1e2c0 4c 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72 75  Later:)  Not tru
1e2d0 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1e2e0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
1e2f0 20 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c 69   by having dupli
1e300 63 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  cate.  ** pages 
1e310 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1e320 28 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74 65  (ex: corrupt9.te
1e330 73 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  st) then the fol
1e340 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20  lowing is not.  
1e350 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ** necessarily t
1e360 72 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61  rue:.  */.  /* a
1e370 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a  ssert( !pPg->inJ
1e380 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1e390 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1e3a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1e3b0 3b 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ; */..  assert( 
1e3c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1e3d0 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al!=0 );.  sqlit
1e3e0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1e3f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
1e400 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50  pPg->pgno);.  pP
1e410 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1e420 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  R_IN_JOURNAL;.  
1e430 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
1e440 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
1e450 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1e460 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
1e470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1e480 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
1e490 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1e4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
1e4b0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
1e4c0 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
1e4d0 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
1e4e0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1e4f0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1e500 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1e510 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e520 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
1e530 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
1e540 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1e550 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  no)).}.../*.** T
1e560 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e570 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1e580 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1e590 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1e5a0 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1e5b0 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1e5c0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1e5d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e5e0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1e5f0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1e600 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29  r, int isDirect)
1e610 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1e620 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1e630 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1e640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1e650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
1e660 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1e670 54 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  TE.  assert( isD
1e680 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  irect==0 );  /* 
1e690 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79  isDirect is only
1e6a0 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63   true for atomic
1e6b0 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69   writes */.#endi
1e6c0 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  f.  if( !pPager-
1e6d0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1e6e0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
1e6f0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
1e700 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
1e710 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1e720 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1e730 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
1e740 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e750 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1e760 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73  rc;..    if( !is
1e770 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
1e780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e790 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
1e7a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e7d0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
1e7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e800 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1e810 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1e820 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1e830 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1e840 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1e850 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
1e860 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
1e870 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e880 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f  rs);.    change_
1e890 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
1e8a0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e8b0 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b  )pPgHdr->pData)+
1e8c0 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1e8d0 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  er);..#ifdef SQL
1e8e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
1e8f0 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20  C_WRITE.    if( 
1e900 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67  isDirect && pPag
1e910 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1e920 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1e930 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67  void *zBuf = pPg
1e940 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  Hdr->pData;.    
1e950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e960 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1e970 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
1e980 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
1e990 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1e9a0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
1e9b0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
1e9c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
1e9d0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
1e9e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
1e9f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
1ea00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ea10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
1ea20 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
1ea30 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
1ea40 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1ea50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ea60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1ea70 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63   MEMDB ){.    rc
1ea80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ea90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1eaa0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1eab0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1eac0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1ead0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1eae0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1eaf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eb00 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
1eb10 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
1eb20 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
1eb30 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
1eb40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1eb50 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1eb60 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
1eb70 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
1eb80 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
1eb90 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
1eba0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
1ebb0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
1ebc0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
1ebd0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1ebe0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1ebf0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
1ec00 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1ec10 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1ec20 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
1ec30 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
1ec40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec50 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
1ec60 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
1ec70 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1ec80 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
1ec90 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
1eca0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
1ecb0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1ecc0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
1ecd0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ece0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
1ecf0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1ed00 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
1ed10 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
1ed20 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
1ed30 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
1ed40 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
1ed50 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1ed60 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
1ed70 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1ed80 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1ed90 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1eda0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1edb0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1edc0 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1edd0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1ede0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1edf0 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s)..**.** If the
1ee00 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
1ee10 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
1ee20 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
1ee30 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
1ee40 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
1ee50 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
1ee60 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
1ee70 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
1ee80 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
1ee90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eea0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
1eeb0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
1eec0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
1eed0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1eee0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1eef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1ef00 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1ef10 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1ef20 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
1ef30 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67   *zMaster, .  Pg
1ef40 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74  no nTrunc,.  int
1ef50 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74   noSync.){.  int
1ef60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ef70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1ef80 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1ef90 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1efa0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
1efb0 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68   If no changes h
1efc0 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77  ave been made, w
1efd0 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20  e can leave the 
1efe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c  transaction earl
1eff0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1f000 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1f010 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28  ==0 &&.        (
1f020 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1f030 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1f040 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
1f050 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1f060 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1f070 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
1f080 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
1f090 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
1f0a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1f0b0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1f0c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1f0d0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
1f0e0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
1f0f0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
1f100 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
1f110 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1f120 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
1f130 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20  er, nTrunc);..  
1f140 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1f150 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
1f160 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
1f170 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
1f180 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
1f190 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
1f1a0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
1f1b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
1f1c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1f1d0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
1f1e0 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
1f1f0 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
1f200 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
1f210 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66  dr *pPg;..#ifdef
1f220 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1f230 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
1f240 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72  /* The atomic-wr
1f250 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1f260 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
1f270 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  all of the.    *
1f280 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  * following are 
1f290 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  true:.    **.   
1f2a0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c   **    + The fil
1f2b0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
1f2c0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
1f2d0 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
1f2e0 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
1f2f0 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
1f300 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  size, and.    **
1f310 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69      + This commi
1f320 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
1f330 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
1f340 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
1f350 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74     **    + Exact
1f360 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
1f370 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
1f380 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
1f390 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1f3a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1f3b0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
1f3c0 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e  an be used, then
1f3d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f3e0 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20  e will never.   
1f3f0 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66   ** be created f
1f400 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
1f410 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1f420 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69  int useAtomicWri
1f430 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  te;.    pPg = sq
1f440 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1f450 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1f460 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74  ache);.    useAt
1f470 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
1f480 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
1f490 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
1f4a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1f4b0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1f4c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
1f4d0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
1f4e0 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
1f4f0 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20   nTrunc==0 && . 
1f500 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20 7c         (pPg==0 |
1f510 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d 30  | pPg->pDirty==0
1f520 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
1f530 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1f540 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1f550 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1f560 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1f570 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
1f580 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
1f590 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
1f5a0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
1f5b0 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
1f5c0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
1f5d0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
1f5e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f5f0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
1f600 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
1f610 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1f620 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
1f630 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1f640 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
1f650 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
1f660 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
1f670 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
1f680 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
1f690 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1f6a0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
1f6b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
1f6c0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
1f6d0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
1f6e0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
1f6f0 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
1f700 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
1f710 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
1f720 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
1f730 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1f740 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
1f750 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
1f760 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
1f770 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
1f780 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
1f790 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
1f7a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1f7b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f7c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f7d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1f7e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1f7f0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
1f800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
1f820 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
1f830 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
1f840 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
1f850 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
1f860 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
1f870 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
1f880 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f890 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1f8a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f8b0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1f8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1f8d0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1f8e0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1f8f0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1f900 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1f910 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1f920 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1f930 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1f940 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1f950 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1f960 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1f970 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1f980 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1f990 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f9a0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1f9b0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1f9c0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1f9d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1f9e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1f9f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1fa00 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1fa10 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
1fa20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1fa30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fa40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fa50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1fa60 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1fa70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
1fa80 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1fa90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1faa0 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  UM.        if( n
1fab0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1fac0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1fad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1fae0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1faf0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1fb00 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1fb10 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1fb20 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1fb30 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1fb40 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1fb50 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1fb60 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1fb70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1fb80 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1fb90 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
1fba0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
1fbb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1fbc0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1fbd0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1fbe0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1fbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fc00 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
1fc10 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1fc20 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
1fc30 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1fc40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fc50 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1fc60 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1fc80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fc90 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1fcb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fcc0 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1fcd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fce0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1fcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fd00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd10 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fd20 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1fd30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a 20  }.          } . 
1fd40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1fd50 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1fd60 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1fd70 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1fd80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1fd90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1fda0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1fdb0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1fdc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1fdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fde0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fdf0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fe00 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
1fe10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fe20 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1fe30 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1fe40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fe50 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1fe60 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1fe70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fe80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fe90 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1fea0 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1feb0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1fec0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fed0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1fee0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fef0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1ff00 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1ff10 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1ff20 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1ff30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ff40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
1ff50 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1ff60 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
1ff70 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
1ff80 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65  error might have
1ff90 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20   left the dirty 
1ffa0 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20  list all fouled 
1ffb0 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a  up here,.      *
1ffc0 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  * but that does 
1ffd0 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
1ffe0 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65  se if the if the
1fff0 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a   dirty list did.
20000 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72        ** get cor
20010 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65  rupted, then the
20020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
20030 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a  l roll back and.
20040 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64        ** discard
20050 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e   the dirty list.
20060 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73    There is an as
20070 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sert in.      **
20080 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
20090 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61  irty_pages() tha
200a0 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
200b0 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20  no attempt.     
200c0 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75   ** is made to u
200d0 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69  se an invalid di
200e0 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  rty list..      
200f0 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79  */.      goto sy
20100 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nc_exit;.    }. 
20110 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
20120 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
20130 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20  >pPCache);..    
20140 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
20150 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
20160 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
20170 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
20180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20190 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
201a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
201b0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
201c0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
201d0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
201e0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
201f0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
20200 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
20210 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
20220 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
20230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20240 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
20250 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
20260 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
20270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
20280 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
20290 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
202a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
202b0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
202c0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
202d0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
202e0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
202f0 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
20300 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
20310 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
20320 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
20330 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
20340 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
20350 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
20360 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
20370 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
20380 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20390 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
203a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
203b0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
203c0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
203d0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
203e0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
203f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
20400 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
20410 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
20420 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
20430 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
20440 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20450 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
20460 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
20470 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
20480 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
20490 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
204a0 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
204b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
204c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
204d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
204e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
204f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
20500 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
20510 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
20520 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
20530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20540 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
20550 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
20560 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
20570 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
20580 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
20590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
205a0 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
205b0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
205c0 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
205d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
205e0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
205f0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20600 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
20610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20620 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
20630 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
20640 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20650 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
20660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
20670 63 61 63 68 65 43 6f 6d 6d 69 74 28 70 50 61 67  cacheCommit(pPag
20680 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 29 3b  er->pPCache, 0);
20690 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
206a0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
206b0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
206c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 41 73   sqlite3PcacheAs
206d0 73 65 72 74 46 6c 61 67 73 28 70 50 61 67 65 72  sertFlags(pPager
206e0 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50 47  ->pPCache, 0, PG
206f0 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  HDR_IN_JOURNAL);
20700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20710 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
20720 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
20730 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20740 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
20750 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  CED || !pPager->
20760 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
20770 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
20780 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
20790 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
207a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 72 63 20  Master);.    rc 
207b0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
207c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
207d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
207e0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
207f0 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
20800 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
20810 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
20820 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
20830 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20840 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
20850 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
20860 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
20870 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
20880 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
20890 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
208a0 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
208b0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
208c0 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
208d0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
208e0 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
208f0 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
20900 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
20910 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
20920 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
20930 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
20940 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
20950 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
20960 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
20970 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
20980 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
20990 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
209a0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
209b0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
209c0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
209d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
209e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
209f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
20a00 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
20a10 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
20a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47  SQLITE_OK;.  PAG
20a30 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
20a40 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
20a50 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
20a60 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73  ( MEMDB ){.    s
20a70 71 6c 69 74 65 33 50 63 61 63 68 65 52 6f 6c 6c  qlite3PcacheRoll
20a80 62 61 63 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  back(pPager->pPC
20a90 61 63 68 65 2c 20 31 29 3b 0a 20 20 20 20 73 71  ache, 1);.    sq
20aa0 6c 69 74 65 33 50 63 61 63 68 65 52 6f 6c 6c 62  lite3PcacheRollb
20ab0 61 63 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ack(pPager->pPCa
20ac0 63 68 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  che, 0);.    sql
20ad0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
20ae0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
20af0 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  he);.    sqlite3
20b00 50 63 61 63 68 65 41 73 73 65 72 74 46 6c 61 67  PcacheAssertFlag
20b10 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
20b20 65 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a  e, 0, PGHDR_IN_J
20b30 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 70 50 61  OURNAL);.    pPa
20b40 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
20b50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20b60 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
20b70 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
20b80 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
20b90 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
20ba0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
20bb0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
20bc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
20bd0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20be0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
20bf0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
20c00 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
20c10 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20c20 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
20c30 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
20c40 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20c50 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20c60 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20c70 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
20c80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20c90 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
20ca0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
20cb0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20cc0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
20cd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
20ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
20cf0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20d00 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
20d10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
20d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
20d30 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
20d40 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
20d50 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
20d60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20d70 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
20d80 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
20d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20da0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
20db0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
20dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20dd0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
20de0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20df0 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  }..    pPager->d
20e00 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 20  bSize = -1;..   
20e10 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
20e20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
20e30 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
20e40 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
20e50 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
20e60 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
20e70 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
20e80 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
20e90 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
20ea0 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
20eb0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
20ec0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
20ed0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
20ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ef0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
20f00 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
20f10 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
20f20 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
20f30 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
20f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20f50 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
20f60 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
20f70 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
20f80 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
20f90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
20fa0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
20fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20fc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20fd0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20fe0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
20ff0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
21000 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
21010 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
21020 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
21030 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21040 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
21050 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
21060 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
21070 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
21080 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
21090 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
210a0 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
210b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
210c0 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
210d0 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
210e0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
210f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21100 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
21110 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
21120 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21130 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
21140 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
21150 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
21160 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
21170 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
21180 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
21190 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
211a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
211b0 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
211c0 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
211d0 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
211e0 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
211f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
21200 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
21210 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
21220 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
21230 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
21240 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
21250 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21260 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70  IsMemdb(Pager *p
21270 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21280 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66   MEMDB;.}.#endif
21290 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
212a0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
212b0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
212c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
212d0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
212e0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
212f0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
21300 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
21310 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
21320 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
21330 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
21340 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
21350 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
21360 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
21370 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
21380 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
21390 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
213a0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
213b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
213c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
213d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
213e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
213f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21400 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
21410 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
21420 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
21430 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
21440 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
21450 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
21460 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21470 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
21480 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
21490 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
214a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
214b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
214c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
214d0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
214e0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
214f0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
21500 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
21510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21520 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21530 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
21540 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21550 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b  r->pInStmt==0 );
21560 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  .  pPager->pInSt
21570 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  mt = sqlite3Bitv
21580 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
21590 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  >dbSize);.  if( 
215a0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
215b0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
215c0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
215d0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
215e0 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
215f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21600 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
21610 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
21620 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
21630 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
21640 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21650 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
21660 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
21670 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
21680 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
21690 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
216a0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
216b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
216c0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
216d0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
216e0 73 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  stfd, SQLITE_OPE
216f0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
21700 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21710 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67     goto stmt_beg
21720 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  in_failed;.    }
21730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
21740 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
21750 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
21760 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
21770 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
21780 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21790 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
217a0 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
217b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
217c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
217d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
217e0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
217f0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
21800 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
21810 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
21820 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
21830 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
21840 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
21850 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42   rc = pagerStmtB
21860 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
21870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21880 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
21890 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
218a0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
218b0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
218c0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
218d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
218e0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
218f0 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
21900 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21910 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
21920 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
21930 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
21940 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
21950 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  tmt);.      pPag
21960 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b  er->pInStmt = 0;
21970 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
21990 6f 6d 6d 69 74 28 70 50 61 67 65 72 2d 3e 70 50  ommit(pPager->pP
219a0 43 61 63 68 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Cache, 1);.    }
219b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
219c0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
219d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
219e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
219f0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
21a00 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
21a10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21a20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
21a30 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
21a40 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
21a50 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
21a60 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21a70 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
21a80 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
21a90 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
21aa0 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
21ab0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21ac0 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  er));.    if( ME
21ad0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
21ae0 69 74 65 33 50 63 61 63 68 65 52 6f 6c 6c 62 61  ite3PcacheRollba
21af0 63 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ck(pPager->pPCac
21b00 68 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50  he, 1);.      pP
21b10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
21b20 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
21b30 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75  .      pager_tru
21b40 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
21b50 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
21b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21b80 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
21b90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
21ba0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
21bb0 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
21bc0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
21bd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21be0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
21bf0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
21c00 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
21c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21c20 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
21c30 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
21c40 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
21c50 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
21c60 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
21c70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21c80 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
21c90 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
21ca0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
21cb0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
21cc0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
21cd0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
21ce0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
21cf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21d00 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
21d10 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
21d20 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
21d30 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
21d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
21d50 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
21d60 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
21d70 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
21d80 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
21d90 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
21da0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
21db0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
21dc0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
21dd0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21de0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
21df0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
21e00 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
21e10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21e20 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
21e30 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
21e40 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
21e50 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21e60 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
21e70 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
21e80 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
21e90 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
21ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
21eb0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
21ec0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
21ed0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
21ee0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21ef0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
21f00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21f10 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
21f20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
21f30 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
21f40 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
21f50 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
21f60 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
21f70 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
21f80 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
21f90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21fa0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
21fb0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
21fc0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
21fd0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
21fe0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
21ff0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
22000 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
22010 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
22020 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
22030 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
22040 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
22050 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
22060 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
22070 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
22080 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
22090 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
220a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
220b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
220c0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
220d0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
220e0 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
220f0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
22100 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
22110 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
22120 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
22130 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
22140 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
22150 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
22160 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
22170 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
22180 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
22190 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
221a0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
221b0 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
221c0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
221d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
221e0 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
221f0 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
22200 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
22210 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
22220 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
22230 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
22240 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
22250 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
22260 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
22270 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
22280 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
22290 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
222a0 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
222b0 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
222c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
222d0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
222e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
222f0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
22300 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
22310 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
22320 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
22330 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
22340 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
22350 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
22360 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
22370 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
22380 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
22390 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
223a0 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
223b0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
223c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
223d0 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
223e0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
223f0 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
22400 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
22410 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
22420 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
22430 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
22440 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
22450 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
22460 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
22470 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
22480 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
22490 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
224a0 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
224b0 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
224c0 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
224d0 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
224e0 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
224f0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
22500 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
22510 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
22520 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
22530 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
22540 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d  pgno, int isComm
22550 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  it){.  PgHdr *pP
22560 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61  gOld;  /* The pa
22570 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
22580 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
22590 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
225a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
225b0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50  ->nRef>0 );..  P
225c0 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45  AGERTRACE5("MOVE
225d0 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
225e0 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
225f0 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
22600 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22610 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
22620 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
22630 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
22640 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
22650 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
22660 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
22670 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
22680 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
22690 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  nt(pPg);..  /* I
226a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  f the journal ne
226b0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
226c0 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70  ed before page p
226d0 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a  Pg->pgno can.  *
226e0 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c  * be written to,
226f0 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
22700 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
22710 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  le needSyncPgno.
22720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
22730 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
22740 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73  is set, there is
22750 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
22760 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74  mber that.  ** t
22770 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
22780 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
22790 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
227a0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a  page pPg->pgno .
227b0 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74    ** can be writ
227c0 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
227d0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
227e0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
227f0 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  rite to it..  */
22800 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
22810 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
22820 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74  NC) && !isCommit
22830 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
22840 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
22850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
22860 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
22870 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 7c 7c 20 28  IN_JOURNAL) || (
22880 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
22890 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
228a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
228b0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
228c0 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
228d0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
228e0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
228f0 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
22900 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
22910 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
22920 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
22930 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
22940 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
22950 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
22960 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
22970 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
22980 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
22990 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
229a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
229b0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
229c0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
229d0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
229e0 66 6c 61 67 73 20 26 3d 20 7e 28 50 47 48 44 52  flags &= ~(PGHDR
229f0 5f 4e 45 45 44 5f 53 59 4e 43 7c 50 47 48 44 52  _NEED_SYNC|PGHDR
22a00 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _IN_JOURNAL);.  
22a10 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
22a20 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
22a30 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  no);.  assert( !
22a40 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64  pPgOld || pPgOld
22a50 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69  ->nRef==1 );.  i
22a60 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
22a70 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28   pPg->flags |= (
22a80 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47  pPgOld->flags&PG
22a90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a  HDR_NEED_SYNC);.
22aa0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
22ab0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
22ac0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
22ad0 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 61 73 73  pgno) ){.    ass
22ae0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
22af0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
22b00 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41   PGHDR_IN_JOURNA
22b10 4c 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  L;.  }..  sqlite
22b20 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
22b30 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
22b40 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  gOld ){.    sqli
22b50 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
22b60 67 4f 6c 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  gOld, 0);.    sq
22b70 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
22b80 73 65 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  se(pPgOld);.  }.
22b90 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
22ba0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
22bb0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70  tyCache = 1;.  p
22bc0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
22bd0 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  d = 1;..  if( ne
22be0 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
22bf0 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
22c00 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
22c10 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
22c20 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
22c30 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
22c40 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
22c50 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
22c60 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
22c70 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
22c80 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
22c90 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
22ca0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
22cb0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
22cc0 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20  the .    ** "is 
22cd0 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65  journaled" bitve
22ce0 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20  c flag has been 
22cf0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
22d00 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
22d10 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67  y.    ** loading
22d20 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22d30 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
22d40 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
22d50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  gHdr.needSync . 
22d60 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20     ** flag..    
22d70 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
22d80 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
22d90 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22da0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61  he page-cache fa
22db0 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a  ils, (due.    **
22dc0 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   to a malloc() o
22dd0 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63  r IO failure), c
22de0 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20  lear the bit in 
22df0 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d  the pInJournal[]
22e00 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f  .    ** array. O
22e10 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
22e20 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
22e30 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69  and written agai
22e40 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  n in.    ** this
22e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
22e60 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
22e70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22e80 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20  file before.    
22e90 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  ** it is synced 
22ea0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
22eb0 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c   file. This way,
22ec0 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69   it may end up i
22ed0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
22ee0 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c  rnal file twice,
22ef0 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74   but that is not
22f00 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
22f10 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
22f20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
22f30 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
22f40 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
22f50 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
22f60 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
22f70 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
22f80 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
22f90 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
22fa0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
22fb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22fc0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
22fd0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22fe0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
22ff0 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
23000 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
23010 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
23030 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
23040 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e   && (int)needSyn
23050 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  cPgno<=pPager->o
23060 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
23070 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
23080 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  ecClear(pPager->
23090 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64  pInJournal, need
230a0 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20  SyncPgno);.     
230b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
230c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
230d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
230e0 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
230f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
23100 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  0 && !MEMDB );. 
23110 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73     pPgHdr->flags
23120 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
23130 59 4e 43 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  YNC;.    pPgHdr-
23140 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
23150 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
23160 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
23170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
23180 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
23190 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
231a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
231b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
231c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
231d0 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
231e0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
231f0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
23200 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
23210 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
23220 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
23230 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
23240 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
23250 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23260 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
23270 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
23280 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
23290 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
232a0 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
232b0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
232c0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
232d0 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
232e0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
232f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
23300 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
23310 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74  pPager?pPg->pExt
23320 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ra:0);.}../*.** 
23330 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
23340 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
23350 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
23360 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
23370 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
23380 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
23390 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
233a0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
233b0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
233c0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
233d0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
233e0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
233f0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
23400 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
23410 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
23420 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
23430 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
23440 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
23450 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
23460 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
23470 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
23480 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
23490 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
234a0 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
234b0 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
234c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
234d0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
234e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
234f0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
23500 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
23510 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23520 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
23530 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
23540 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
23550 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
23560 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
23570 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
23580 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
23590 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
235a0 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
235b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
235c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
235d0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
235e0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
235f0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
23600 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
23610 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23620 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
23630 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
23640 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
23650 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
23660 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
23670 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
23680 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
23690 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
236a0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
236b0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
236c0 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  of PAGER_JOURNAL
236d0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
236e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
236f0 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47 45  LETE or .** PAGE
23700 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
23710 52 53 49 53 54 2e 20 49 66 20 74 68 65 20 70 61  RSIST. If the pa
23720 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
23730 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
23740 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
23750 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
23760 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
23770 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
23780 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
23790 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
237a0 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a 2a  ODE_DELETE or.**
237b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
237c0 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e 64 69  DE_PERSIST, indi
237d0 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
237e0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
237f0 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ated).** journal
23800 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
23810 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
23820 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
23830 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
23840 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
23850 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23860 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
23870 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
23880 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23890 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
238a0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
238b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
238c0 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20  _PERSIST.       
238d0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
238e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
238f0 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74  _OFF );.  assert
23900 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
23910 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
23920 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
23930 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
23940 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4a 4f  E>=0 && PAGER_JO
23950 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
23960 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  T>=0 );.  if( eM
23970 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  ode>=0 ){.    pP
23980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
23990 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
239a0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
239b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
239c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
239d0 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
239e0 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
239f0 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
23a00 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  les..*/.i64 sqli
23a10 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
23a20 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
23a30 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
23a40 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
23a50 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
23a60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23a70 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
23a80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
23a90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23aa0 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66  Limit;.}..#endif
23ab0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23ac0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.