/ Hex Artifact Content
Login

Artifact 6426902ba983ce6872fcec20ba72796a79d6cead:


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: 35 20 32 30 30 38 2f 30 39 2f 32 36 20 32 31 3a  5 2008/09/26 21:
0360: 30 38 3a 30 38 20 64 72 68 20 45 78 70 20 24 0a  08:08 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 52 65  dif.  void (*xRe
28c0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
28d0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
28e0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
28f0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
2900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2910: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
2920: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2930: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
2940: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
2950: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
2960: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
2970: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
2980: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
2990: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
29a0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
29b0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
29c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
29d0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
29e0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
29f0: 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  use */.  char db
2a00: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
2a10: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
2a20: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
2a30: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
2a40: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
2a50: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
2a60: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
2a70: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
2a80: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
2a90: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ab0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
2ac0: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 7d  ache object */.}
2ad0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
2ae0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
2af0: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
2b00: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
2b10: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
2b20: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
2b30: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
2b40: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
2b50: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
2b60: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
2b70: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
2b80: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
2b90: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ba0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
2bb0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
2bc0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
2bd0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
2be0: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
2bf0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2c00: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
2c10: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
2c20: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
2c30: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
2c40: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2c50: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
2c60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c70: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2c80: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
2c90: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
2ca0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
2cb0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2cc0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
2cd0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
2ce0: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
2cf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
2d00: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
2d10: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
2d20: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
2d30: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
2d40: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
2d50: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
2d60: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
2d70: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
2d80: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
2d90: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
2da0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
2db0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
2dc0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
2dd0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
2de0: 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77  al is begin.** w
2df0: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
2e00: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
2e10: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
2e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
2e30: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
2e40: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
2e50: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
2e60: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
2e70: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
2e80: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
2e90: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
2ea0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
2eb0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
2ec0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
2ed0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
2ee0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
2ef0: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
2f00: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
2f10: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
2f20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
2f30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2f40: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
2f50: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
2f60: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
2f70: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
2f80: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
2f90: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
2fa0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
2fb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2fc0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
2fd0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
2fe0: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
2ff0: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
3000: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
3010: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
3020: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
3030: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
3040: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
3050: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
3060: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
3070: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
3080: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
3090: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
30a0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
30b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
30c0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
30d0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
30e0: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
30f0: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
3100: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
3110: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
3120: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
3130: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
3140: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
3150: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
3160: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
3170: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
3180: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
3190: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
31a0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
31b0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
31c0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
31d0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
31e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
31f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3200: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
3210: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
3220: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
3230: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
3240: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
3250: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
3260: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
3270: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
3280: 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d  ournal is determ
3290: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  ined.** by the f
32a0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e  ollowing macros.
32b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
32c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
32d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
32e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
32f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
3300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
3310: 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68  his pager. In th
3320: 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63  e future, this c
3330: 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74  ould be.** set t
3340: 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61  o some value rea
3350: 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  d from the disk 
3360: 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20  controller. The 
3370: 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61  important.** cha
3380: 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74  racteristic is t
3390: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61  hat it is the sa
33a0: 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73  me size as a dis
33b0: 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65  k sector..*/.#de
33c0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
33d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
33e0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
33f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
3400: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
3410: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
3420: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
3430: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
3440: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
3450: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
3460: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
3470: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
3480: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
3490: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
34a0: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
34b0: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
34c0: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
34d0: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
34e0: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
34f0: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
3500: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3510: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
3520: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
3530: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
3540: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
3550: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
3560: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
3570: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
3580: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
3590: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
35a0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
35b0: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
35c0: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
35d0: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
35e0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
35f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3600: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3610: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3620: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3630: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3640: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
3650: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
3660: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
3670: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
3680: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
3690: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
36a0: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
36b0: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
36c0: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
36d0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
36e0: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
36f0: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3700: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
3710: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
3720: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
3730: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
3750: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
3760: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
3770: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
3780: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
3790: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
37a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
37b0: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
37c0: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
37d0: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
37e0: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
37f0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
3800: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
3810: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
3820: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
3830: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3840: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
3850: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
3860: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
3870: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
3880: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
3890: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
38a0: 20 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 61     return pPg->a
38b0: 70 53 61 76 65 5b 31 5d 21 3d 30 3b 0a 20 20 7d  pSave[1]!=0;.  }
38c0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
38d0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
38e0: 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  st(pPager->pInSt
38f0: 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
3900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
3910: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
3920: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
3930: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3940: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
3950: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
3960: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
3970: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3980: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
3990: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
39a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
39b0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
39c0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
39d0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
39e0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
39f0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
3a00: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
3a10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
3a20: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
3a30: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
3a40: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3a50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
3a60: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
3a70: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
3a80: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
3a90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3aa0: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
3ab0: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
3ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3ae0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3af0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
3b00: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
3b10: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
3b20: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
3b30: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
3b40: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
3b50: 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  A,B)../*.** Writ
3b60: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3b70: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
3b80: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3b90: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
3ba0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
3bb0: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
3bc0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
3bd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
3be0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
3bf0: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
3c00: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
3c10: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
3c20: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
3c30: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
3c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
3c50: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3c60: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
3c70: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20  ../*.** If file 
3c80: 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c  pFd is open, cal
3c90: 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  l sqlite3OsUnloc
3ca0: 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74  k() on it..*/.st
3cb0: 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63  atic int osUnloc
3cc0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
3cd0: 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  pFd, int eLock){
3ce0: 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65  .  if( !pFd->pMe
3cf0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
3d00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
3d10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3d20: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
3d30: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
3d40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3d50: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
3d60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
3d70: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
3d80: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
3d90: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
3da0: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
3db0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
3dc0: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
3dd0: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
3de0: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
3df0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
3e00: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
3e10: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
3e20: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
3e30: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
3e40: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
3e50: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
3e60: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
3e70: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
3e80: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
3e90: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
3ea0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
3eb0: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
3ec0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
3ed0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
3ee0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
3ef0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
3f00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3f10: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3f20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
3f30: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
3f40: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
3f50: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
3f60: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
3f70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
3f80: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
3f90: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
3fa0: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
3fb0: 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20  er){.  int dc;  
3fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
3fd0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
3fe0: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63  cs */.  int nSec
3ff0: 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63  tor;      /* Sec
4000: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
4010: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
4020: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
4030: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4040: 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
4050: 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65  ;..  if( fd->pMe
4060: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20  thods ){.    dc 
4070: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
4080: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
4090: 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  (fd);.    nSecto
40a0: 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  r = sqlite3OsSec
40b0: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20  torSize(fd);.   
40c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
40d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
40e0: 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45  .  assert(SQLITE
40f0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
4100: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61  ==(512>>8));.  a
4110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
4120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
4130: 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66  5536>>8));..  if
4140: 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ( !fd->pMethods 
4150: 7c 7c 20 0a 20 20 20 20 20 20 20 28 64 63 20 26  || .       (dc &
4160: 20 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41   (SQLITE_IOCAP_A
4170: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
4180: 29 29 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73  )) && nSector<=s
4190: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65  zPage) ){.    re
41a0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
41b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
41c0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
41d0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
41e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
41f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4200: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
4210: 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f  led when an erro
4220: 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
4230: 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64  the pager.** cod
4240: 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  e. The first arg
4250: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
4260: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
4270: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a  structure, the.*
4280: 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  * second the err
4290: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
42a0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
42b0: 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
42c0: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61  tion. .** The va
42d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
42e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
42f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
4300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
4310: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
4320: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
4330: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
4340: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
4350: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
4360: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
4370: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
4380: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
4390: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
43a0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
43b0: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
43c0: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
43d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
43e0: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
43f0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
4400: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
4410: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
4420: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
4430: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
4440: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
4450: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
4460: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
4470: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
4480: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
4490: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
44a0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
44b0: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
44c0: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
44d0: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
44e0: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
44f0: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
4500: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
4510: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
4520: 20 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74   replayed..*/.st
4530: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4540: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
4550: 61 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  ager);.static in
4560: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4570: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4580: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
4590: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
45a0: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
45b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
45c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
45d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
45e0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
45f0: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
4600: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
4610: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
4620: 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  .  );.  if(.    
4630: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
4640: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4650: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
4660: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
4670: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
4680: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
4690: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  rc;.    if( pPag
46a0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
46b0: 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26  _UNLOCK .     &&
46c0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
46d0: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
46e0: 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
46f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
4700: 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
4710: 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61  ady unlocked, ca
4720: 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ll pager_unlock(
4730: 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a  ) now to.      *
4740: 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  * clear the erro
4750: 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75  r state and ensu
4760: 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
4770: 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20  r-cache is .    
4780: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20    ** completely 
4790: 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  empty..      */.
47a0: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
47b0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
47c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
47d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
47e0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
47f0: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
4800: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
4810: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
4820: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
4830: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
4840: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
4850: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
4860: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
4870: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
4880: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4890: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
48a0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
48b0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
48c0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
48d0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
48e0: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
48f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4900: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
4910: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
4920: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
4930: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
4940: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
4950: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
4960: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4970: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
4980: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
4990: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
49a0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
49b0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
49c0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
49d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
49e0: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
49f0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
4a00: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
4a10: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
4a20: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
4a30: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
4a40: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
4a50: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4a60: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4a70: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4a80: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4a90: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4aa0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4ab0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4ac0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4ad0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4ae0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4af0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4b00: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4b10: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4b20: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4b30: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4b40: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4b50: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4b60: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4b70: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4b80: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4b90: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4ba0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4bb0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4bc0: 20 7c 7c 20 4d 45 4d 44 42 20 0a 20 20 20 20 20   || MEMDB .     
4bd0: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
4be0: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
4bf0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
4c00: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
4c10: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
4c20: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
4c30: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
4c40: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
4c50: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
4c60: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
4c70: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
4c80: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
4c90: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
4ca0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
4cb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
4cc0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
4cd0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
4ce0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
4cf0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4d00: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  read from the en
4d10: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
4d20: 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  d .** written in
4d30: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
4d40: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
4d50: 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  . .**.** zMaster
4d60: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
4d70: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
4d80: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
4d90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
4da0: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
4db0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
4dc0: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
4dd0: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
4de0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
4df0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
4e00: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
4e10: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
4e20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
4e30: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
4e40: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
4e50: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
4e60: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
4e70: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
4e80: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
4e90: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
4ea0: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
4eb0: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
4ec0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
4ed0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
4ee0: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
4ef0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4f00: 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65  s present zMaste
4f10: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
4f20: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
4f30: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
4f40: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
4f50: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
4f60: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
4f70: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
4f80: 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  int nMaster){.  
4f90: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
4fa0: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
4fb0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32  u32 cksum;.  u32
4fc0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
4fd0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
4fe0: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
4ff0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5000: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5010: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
5020: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
5030: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
5040: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
5050: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5060: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5070: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5080: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5090: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
50a0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
50b0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
50c0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
50d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
50e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
50f0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
5100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5110: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
5120: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5130: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
5140: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
5150: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5160: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5170: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5180: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
5190: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
51a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
51b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
51c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
51d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
51e0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
51f0: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
5200: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
5210: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5220: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
5230: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
5240: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
5250: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
5260: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5270: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5280: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5290: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
52a0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
52b0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
52c0: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
52d0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
52e0: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
52f0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
5300: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
5310: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
5320: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
5330: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
5340: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
5350: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
5360: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
5370: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
5380: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
5390: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
53a0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
53b0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
53c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
53d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
53e0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
53f0: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5410: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5420: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5430: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5440: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5450: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5460: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5470: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5480: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5490: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
54a0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
54b0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
54c0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
54d0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
54e0: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
54f0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5500: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5510: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
55a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
55b0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
55c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
55d0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
55e0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
55f0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
5600: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
5610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
5620: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
5630: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
5640: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5650: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
5660: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5670: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
5680: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
5690: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
56a0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
56b0: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
56c0: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
56d0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
56e0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
56f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
5700: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
5710: 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f  ** Write zeros o
5720: 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f  ver the header o
5730: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5740: 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  le.  This has th
5750: 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69  e.** effect of i
5760: 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
5770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
5780: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a   committing the.
5790: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ** transaction..
57a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
57b0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
57c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
57d0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
57e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
57f0: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
5800: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
5810: 38 5d 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28  8] = {0};..  if(
5820: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5830: 4f 66 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69  Off ){.    i64 i
5840: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
5850: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
5860: 3b 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ;..    IOTRACE((
5870: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
5880: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
5890: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
58a0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
58b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
58c0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
58d0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
58e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
58f0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5900: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72  pPager->jfd, zer
5910: 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72  oHdr, sizeof(zer
5920: 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oHdr), 0);.    }
5930: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5940: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
5950: 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
5960: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5970: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
5980: 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  d, SQLITE_SYNC_D
5990: 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e  ATAONLY|pPager->
59a0: 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
59b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
59c0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
59d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
59e0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
59f0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
5a00: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
5a10: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
5a20: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
5a30: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
5a40: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
5a50: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
5a60: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
5a70: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
5a80: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
5a90: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
5aa0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
5ab0: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
5ac0: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
5ad0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
5ae0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
5af0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
5b00: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
5b10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
5b20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
5b30: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
5b40: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
5b50: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
5b60: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
5b70: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
5b80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5b90: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
5ba0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
5bb0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
5bc0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
5bd0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
5be0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
5bf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
5c00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
5c10: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
5c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5c30: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
5c40: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
5c50: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
5c60: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
5c70: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
5c80: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
5c90: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
5ca0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
5cb0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
5cc0: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
5cd0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
5ce0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
5cf0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
5d00: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
5d10: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
5d20: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
5d30: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
5d40: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
5d50: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
5d60: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
5d70: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
5d80: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
5d90: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
5da0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
5db0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
5dc0: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
5dd0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
5de0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
5df0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
5e00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
5e10: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
5e20: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
5e30: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
5e40: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
5e50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5e60: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
5e70: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
5e80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5e90: 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61  OK;.  char *zHea
5ea0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
5eb0: 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e 74 20 6e  mpSpace;.  int n
5ec0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
5ed0: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 6e 74  >pageSize;.  int
5ee0: 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69 66 28 20   nWrite;..  if( 
5ef0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
5f00: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5f10: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
5f20: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5f30: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
5f40: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5f50: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5f60: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5f70: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5f80: 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20  rnalOff;.  }..  
5f90: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
5fa0: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
5fb0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5fc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5fd0: 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65  f;..  memcpy(zHe
5fe0: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
5ff0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
6000: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20  rnalMagic));..  
6010: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
6020: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
6030: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
6040: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
6050: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
6060: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6070: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
6080: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
6090: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
60a0: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
60b0: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
60c0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
60d0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
60e0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
60f0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
6100: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
6110: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
6120: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
6130: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
6140: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
6150: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
6160: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
6170: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
6180: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
6190: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
61a0: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
61b0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
61c0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
61d0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
61e0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
61f0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
6200: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
6210: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
6220: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
6230: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
6240: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
6250: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
6260: 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
6270: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
6280: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
6290: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
62a0: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
62b0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
62c0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
62d0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
62e0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
62f0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
6300: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6310: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
6320: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
6330: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
6340: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
6350: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
6360: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
6370: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
6380: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
6390: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
63a0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
63b0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
63c0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
63d0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
63e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
63f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
6400: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
6410: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f  hods||pPager->no
6420: 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50  Sync);.  if( (pP
6430: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20  ager->noSync) . 
6440: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
6450: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
6460: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
6470: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
6480: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
6490: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
64a0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
64b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
64c0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
64d0: 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62  else{.    put32b
64e0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
64f0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6500: 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  c)], 0);.  }..  
6510: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
6520: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
6530: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
6540: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
6550: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
6560: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
6570: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6580: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6590: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
65a0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
65b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
65c0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
65d0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
65e0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
65f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6600: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
6610: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
6620: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6630: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6640: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6650: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6660: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6670: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6680: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
6690: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70  orSize);.  if( p
66a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
66b0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
66c0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
66d0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
66e0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
66f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
6700: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
6710: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ze);.  }..  for(
6720: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
6730: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
6740: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6750: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
6760: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
6770: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
6780: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
6790: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
67a0: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
67b0: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
67c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
67d0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
67e0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
67f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
6800: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
6810: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
6820: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
6830: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6840: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6850: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6860: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6870: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6880: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6890: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
68a0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
68b0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
68c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
68d0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
68e0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
68f0: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6900: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6910: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6920: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6930: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6940: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6950: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6960: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6970: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6980: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6990: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
69a0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
69b0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
69c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
69d0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
69e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
69f0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6a00: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6a10: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6a20: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6a30: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6a40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6a50: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6a60: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6a70: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6a90: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6aa0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6ab0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6ac0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6ad0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6ae0: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6af0: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6b00: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6b10: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6b30: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6b40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6b50: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6b60: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6b70: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6b80: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6b90: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6ba0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6bb0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6bc0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6bd0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6be0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6bf0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
6c00: 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20   jrnlOff;.  int 
6c10: 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65  iPageSize;..  se
6c20: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6c30: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
6c40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6c50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6c60: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6c70: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6c80: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6c90: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
6ca0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6cb0: 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f;..  rc = sqlit
6cc0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
6cd0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6ce0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72  zeof(aMagic), jr
6cf0: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
6d00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
6d10: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f  jrnlOff += sizeo
6d20: 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66  f(aMagic);..  if
6d30: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6d40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6d50: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
6d60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6d80: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
6d90: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6da0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63  , jrnlOff, pNRec
6db0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6dc0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6dd0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6de0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
6df0: 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  +4, &pPager->cks
6e00: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
6e10: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6e20: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6e30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
6e40: 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a  rnlOff+8, pDbSiz
6e50: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
6e60: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6e70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6e80: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
6e90: 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50  f+16, (u32 *)&iP
6ea0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
6eb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
6ec0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d    && iPageSize>=
6ed0: 35 31 32 20 0a 20 20 20 26 26 20 69 50 61 67 65  512 .   && iPage
6ee0: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
6ef0: 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26  _PAGE_SIZE .   &
6f00: 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  & ((iPageSize-1)
6f10: 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a  &iPageSize)==0 .
6f20: 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67    ){.    u16 pag
6f30: 65 73 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a  esize = iPageSiz
6f40: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
6f50: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
6f60: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61 67  ize(pPager, &pag
6f70: 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  esize);.  }.  if
6f80: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6f90: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
6fa0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
6fb0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
6fc0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
6fd0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
6fe0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
6ff0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
7000: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
7010: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
7020: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
7030: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
7040: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
7050: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
7060: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
7070: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
7080: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
7090: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
70a0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
70b0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
70c0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
70d0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
70e0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
70f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
7100: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
7110: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
7120: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
7130: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
7140: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7150: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
7160: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
7170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7180: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
7190: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
71a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
71b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
71c0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
71d0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
71e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
71f0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
7200: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
7210: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
7220: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
7230: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
7240: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
7250: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
7260: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
7270: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
7280: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
7290: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
72a0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
72b0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
72c0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
72d0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
72e0: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
72f0: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
7300: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
7310: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7320: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
7330: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
7340: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
7350: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
7360: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
7370: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
7380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
7390: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
73a0: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
73b0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
73c0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
73d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
73e0: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
73f0: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
7400: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
7410: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
7420: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
7430: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
7440: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
7450: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
7460: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
7470: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
7480: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
7490: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
74a0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
74b0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
74c0: 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75  64 jrnlSize;.  u
74d0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
74e0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
74f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7500: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
7510: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
7520: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
7530: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7540: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
7550: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
7560: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
7570: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
7580: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
7590: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
75a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
75b0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
75c0: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
75d0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
75e0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
75f0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
7600: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
7610: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
7620: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
7630: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
7640: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
7650: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
7660: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
7670: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
7680: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
7690: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
76a0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
76b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76c0: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
76d0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
76e0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
76f0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
7700: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
7710: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
7720: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
7730: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7740: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
7750: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
7760: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7770: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
7780: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
7790: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
77a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
77b0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
77c0: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
77d0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
77e0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
77f0: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
7800: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
7810: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
7820: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
7830: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
7840: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
7860: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
7870: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
7880: 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  Off);.  jrnlOff 
7890: 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  += 8+sizeof(aJou
78a0: 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50  rnalMagic);.  pP
78b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
78c0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
78d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
78e0: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
78f0: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
7900: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
7910: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
7920: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
7930: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
7940: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
7950: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
7960: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
7970: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
7980: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
7990: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
79a0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
79b0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
79c0: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
79d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
79e0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
79f0: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
7a00: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
7a10: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
7a20: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
7a30: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
7a40: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
7a50: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
7a60: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
7a70: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
7a80: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
7a90: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
7aa0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
7ab0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
7ac0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a  (rc==SQLITE_OK).
7ad0: 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
7ae0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
7af0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
7b00: 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  Size))==SQLITE_O
7b10: 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  K.   && jrnlSize
7b20: 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  >jrnlOff.  ){.  
7b30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7b40: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
7b50: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  >jfd, jrnlOff);.
7b60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
7b80: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
7b90: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
7ba0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
7bb0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
7bc0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
7bd0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
7be0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
7bf0: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
7c00: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
7c10: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
7c20: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c   PgHdr *p;.  sql
7c30: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
7c40: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
7c50: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
7c60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7c70: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
7c80: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
7c90: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
7ca0: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
7cb0: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
7cc0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
7cd0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
7ce0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
7cf0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
7d00: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
7d10: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
7d20: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
7d30: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
7d40: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
7d50: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
7d60: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
7d70: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
7d80: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
7d90: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
7da0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7db0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
7dc0: 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
7dd0: 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
7de0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7df0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
7e00: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
7e10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
7e20: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73  error state, dis
7e30: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
7e40: 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63  s of .** the cac
7e50: 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  he and reset the
7e60: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
7e70: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e   internal state.
7e80: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
7e90: 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d  an open journal-
7ea0: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e  file, then the n
7eb0: 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65  ext time a share
7ec0: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
7ed0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67  ed.** on the pag
7ee0: 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73  er file (by this
7ef0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
7f00: 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20  ocess), it will 
7f10: 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73  be.** treated as
7f20: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
7f30: 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  nd rolled back..
7f40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7f50: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
7f60: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
7f70: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
7f80: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
7f90: 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
7fa0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55      int rc = osU
7fb0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
7fc0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
7fd0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65    if( rc ) pPage
7fe0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
7ff0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
8000: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
8010: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
8020: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
8030: 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77  ))..      /* Alw
8040: 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  ays close the jo
8050: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
8060: 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
8070: 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  abase lock..    
8080: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
8090: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
80a0: 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
80b0: 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
80c0: 74 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74  t.      ** delet
80d0: 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66  e the file out f
80e0: 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
80f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8100: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8110: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
8120: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
8130: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
8140: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8150: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
8160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
8170: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
8180: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
8190: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
81a0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
81b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
81c0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
81d0: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
81e0: 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 70  back);.        p
81f0: 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
8200: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
8210: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
8220: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
8230: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
8240: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
8250: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
8260: 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65  .      ** truste
8270: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
8280: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
8290: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
82a0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
82b0: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
82c0: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
82d0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
82e0: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
82f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
8300: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
8310: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
8320: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8330: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8340: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8350: 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
8360: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
8370: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
8380: 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  tmtOpen ){.     
8390: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
83a0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
83b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
83c0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
83d0: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
83e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  t);.          pP
83f0: 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
8400: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
8410: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
8420: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tOpen = 0;.     
8430: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
8440: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  nUse = 0;.      
8450: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8460: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
8470: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8480: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
8490: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
84a0: 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
84b0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
84c0: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
84d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
84e0: 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c     if( !MEMDB ||
84f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8500: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8510: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
8520: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
8530: 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  K;.      pPager-
8540: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
8550: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
8560: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
8570: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
8580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8590: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
85a0: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
85b0: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
85c0: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
85d0: 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
85e0: 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64  ror state, .** d
85f0: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
8600: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e rollback..*/.s
8610: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
8620: 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
8630: 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69  k(Pager *p){.  i
8640: 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  f( p->errCode==S
8650: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73  QLITE_OK && p->s
8660: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
8670: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
8680: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
8690: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
86a0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
86b0: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
86c0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
86d0: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
86e0: 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  nlock(p);.}../*.
86f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8700: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
8710: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
8720: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
8730: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
8740: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
8750: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
8760: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8770: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
8780: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
8790: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
87a0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
87b0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
87c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
87d0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
87e0: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
87f0: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
8800: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
8810: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
8820: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
8830: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
8840: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
8850: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
8860: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
8870: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
8880: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
8890: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
88a0: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
88b0: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
88c0: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
88d0: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
88e0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
88f0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
8900: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
8910: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
8920: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
8930: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
8940: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8950: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
8960: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
8970: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
8980: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
8990: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
89a0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
89b0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
89c0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
89d0: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
89e0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
89f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
8a00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
8a10: 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  hasMaster){.  in
8a20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8a30: 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  ;.  int rc2 = SQ
8a40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
8a50: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
8a60: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8a70: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
8a80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8a90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
8aa0: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
8ab0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
8ac0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
8ad0: 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72  tOpen && !pPager
8ae0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8af0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
8b00: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
8b10: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
8b20: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
8b30: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
8b40: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
8b50: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8b60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8b70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
8b80: 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
8b90: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
8ba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
8bb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51  er->jfd, 0))==SQ
8bc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8bd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8be0: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
8bf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
8c00: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
8c10: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8c20: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
8c30: 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
8c40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8c50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
8c60: 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20  ERSIST.    ){.  
8c70: 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
8c80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
8c90: 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
8ca0: 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
8cb0: 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
8cc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8cd0: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
8ce0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
8cf0: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
8d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8d10: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
8d20: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
8d30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
8d40: 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20  E || rc );.     
8d50: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8d60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8d80: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8d90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8da0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
8db0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
8dc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8dd0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
8de0: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
8df0: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
8e00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8e10: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
8e20: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
8e30: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
8e40: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
8e50: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8e60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
8e70: 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
8e80: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 70 50 61  llback);.    pPa
8e90: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
8ea0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 71  back = 0;.    sq
8eb0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
8ec0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
8ed0: 63 68 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  che);.#ifdef SQL
8ee0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8ef0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
8f00: 65 49 74 65 72 61 74 65 28 70 50 61 67 65 72 2d  eIterate(pPager-
8f10: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
8f20: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
8f30: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
8f40: 33 50 63 61 63 68 65 43 6c 65 61 72 46 6c 61 67  3PcacheClearFlag
8f50: 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
8f60: 65 2c 0a 20 20 20 20 20 20 20 50 47 48 44 52 5f  e,.       PGHDR_
8f70: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47 48  IN_JOURNAL | PGH
8f80: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 0a 20 20 20  DR_NEED_SYNC.   
8f90: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
8fa0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8fb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8fc0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8fd0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8fe0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
8ff0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
9000: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
9010: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
9020: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
9030: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
9040: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
9050: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
9060: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
9070: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
9080: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
9090: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
90a0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
90b0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
90c0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
90d0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
90e0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
90f0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9100: 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c  c = 0;.  /* lruL
9110: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
9120: 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  d(pPager); */.  
9130: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
9140: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64   -1;.  pPager->d
9150: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
9160: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
9170: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
9180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9190: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
91a0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
91b0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
91c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
91d0: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
91e0: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
91f0: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
9200: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
9210: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
9220: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
9230: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
9240: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
9250: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
9260: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
9270: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
9280: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
9290: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
92a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
92b0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
92c0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
92d0: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
92e0: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
92f0: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
9300: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
9310: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
9320: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
9330: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
9340: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
9350: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
9360: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
9370: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
9380: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
9390: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
93a0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
93b0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
93c0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
93d0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
93e0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
93f0: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
9400: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
9410: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
9420: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
9430: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
9440: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
9450: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
9460: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
9470: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
9480: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
9490: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
94a0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
94b0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
94c0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
94d0: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
94e0: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
94f0: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
9500: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
9510: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
9520: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
9530: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
9540: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
9550: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
9560: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
9570: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
9580: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
9590: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
95a0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
95b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
95c0: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
95d0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
95e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
95f0: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
9600: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
9610: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
9620: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
9630: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
9640: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
9650: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
9660: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
9670: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
9680: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
9690: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
96a0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
96b0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
96c0: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
96d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
96e0: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
96f0: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
9700: 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a  *.** The isMainJ
9710: 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  rnl flag is true
9720: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
9730: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
9740: 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c  urnal and.** fal
9750: 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  se for the state
9760: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
9770: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
9780: 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a   journal uses.**
9790: 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
97a0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
97b0: 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  al does not..*/.
97c0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
97d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
97e0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
97f0: 67 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ger,       /* Th
9800: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
9810: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73  ayed back */.  s
9820: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
9830: 2c 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20  ,   /* The file 
9840: 74 68 61 74 20 69 73 20 74 68 65 20 6a 6f 75 72  that is the jour
9850: 6e 61 6c 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  nal being rolled
9860: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f   back */.  i64 o
9870: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
9880: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 74 68 65  /* Offset of the
9890: 20 70 61 67 65 20 77 69 74 68 69 6e 20 74 68 65   page within the
98a0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
98b0: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20  t isMainJrnl    
98c0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d     /* True for m
98d0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
98e0: 72 6e 61 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20  rnal. False for 
98f0: 53 74 6d 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a  Stmt jrnl */.){.
9900: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
9910: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
9920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
9930: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
9940: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
9950: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9970: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
9980: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
9990: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
99a0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
99b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
99c0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
99d0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
99e0: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
99f0: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
9a00: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
9a10: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
9a20: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73  page */..  /* is
9a30: 4d 61 69 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20  MainJrnl should 
9a40: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
9a50: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
9a60: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
9a70: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9a80: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
9a90: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
9aa0: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9ab0: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
9ac0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
9ad0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
9ae0: 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73  r->stfd) );.  as
9af0: 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a  sert( aData );..
9b00: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9b10: 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26  s(jfd, offset, &
9b20: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
9b30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
9b40: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
9b50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
9b60: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9b70: 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
9b80: 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  t+4);.  if( rc!=
9b90: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9ba0: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9bb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9bc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9bd0: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9be0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
9bf0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
9c00: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
9c10: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
9c20: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
9c30: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
9c40: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
9c50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9c60: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9c70: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9c80: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9c90: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9ca0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9cb0: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9cc0: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9cd0: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9ce0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
9cf0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
9d00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
9d10: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
9d20: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9d30: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
9d40: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9d50: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9d60: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9d70: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9d90: 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
9da0: 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
9db0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
9dc0: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
9dd0: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
9de0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
9df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9e00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9e10: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
9e20: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
9e30: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
9e40: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
9e50: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9e60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
9e70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
9e80: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
9e90: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
9ea0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9eb0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
9ec0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
9ed0: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
9ee0: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
9ef0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
9f00: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
9f10: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
9f20: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
9f30: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
9f40: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
9f50: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
9f60: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9f70: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
9f80: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
9f90: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
9fa0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
9fb0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
9fc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
9fd0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
9fe0: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
9ff0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
a000: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
a010: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
a020: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
a030: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
a040: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
a050: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
a060: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
a070: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
a080: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
a090: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
a0a0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
a0b0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
a0c0: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
a0d0: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
a0e0: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
a0f0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
a100: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
a110: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
a120: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
a130: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
a140: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
a150: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
a160: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
a170: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
a180: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
a190: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
a1a0: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
a1b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
a1c0: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
a1d0: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
a1e0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
a1f0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
a200: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
a210: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
a220: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
a230: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
a240: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
a250: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
a260: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
a270: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
a280: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
a290: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
a2a0: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
a2b0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
a2c0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
a2d0: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
a2e0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
a2f0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
a300: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
a310: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
a320: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
a330: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
a340: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
a350: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
a360: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
a370: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
a380: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
a390: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
a3a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
a3b0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
a3c0: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
a3d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
a3e0: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
a3f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
a400: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
a410: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
a420: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
a430: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
a440: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
a450: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
a460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
a470: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
a480: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
a490: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
a4a0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
a4b0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
a4c0: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
a4d0: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
a4e0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
a4f0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
a500: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
a510: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
a520: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
a530: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
a540: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
a550: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
a560: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
a570: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
a580: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a590: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
a5a0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
a5b0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
a5c0: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
a5d0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
a5e0: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
a5f0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
a600: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
a610: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
a620: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
a630: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
a640: 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE4("PLAYBACK %d
a650: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
a660: 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
a670: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
a680: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
a690: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
a6a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
a6b0: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 28 70  Data));.  if( (p
a6c0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a6d0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
a6e0: 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20    && (pPg==0 || 
a6f0: 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  0==(pPg->flags&P
a700: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
a710: 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
a720: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20  fd->pMethods).  
a730: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
a740: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
a750: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a760: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
a770: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
a780: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
a790: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
a7a0: 66 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fst);.  }.  if( 
a7b0: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
a7c0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
a7d0: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
a7e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
a7f0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
a800: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
a810: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
a820: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
a830: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
a840: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
a850: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
a860: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
a870: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
a880: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
a890: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
a8a0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
a8b0: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
a8c0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
a8d0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
a8e0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
a8f0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
a900: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
a910: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
a920: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
a930: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
a940: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a950: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
a960: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
a970: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a980: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ter(pPg);.    }.
a990: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
a9a0: 6e 6c 20 29 20 6d 61 6b 65 43 6c 65 61 6e 28 70  nl ) makeClean(p
a9b0: 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
a9c0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
a9d0: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
a9e0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
a9f0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
aa00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
aa10: 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
aa20: 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
aa30: 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
aa40: 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
aa50: 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
aa60: 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
aa70: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
aa80: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
aa90: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
aaa0: 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
aab0: 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
aac0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
aad0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
aae0: 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
aaf0: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
ab00: 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
ab10: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
ab20: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
ab30: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
ab40: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
ab50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ab60: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
ab70: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
ab80: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
ab90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
aba0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
abb0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
abc0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
abd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
abe0: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
abf0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
ac00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
ac10: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
ac20: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
ac30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ac40: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
ac50: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
ac60: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
ac70: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
ac80: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
ac90: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
aca0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
acb0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
acc0: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
acd0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a  unction..**.**.*
ace0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
acf0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
ad00: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
ad10: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
ad20: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
ad30: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
ad40: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
ad50: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
ad60: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
ad70: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
ad80: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
ad90: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
ada0: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
adb0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
adc0: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
add0: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
ade0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
adf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ae00: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
ae10: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
ae20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
ae30: 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
ae40: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
ae50: 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
ae60: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
ae70: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71  r_open = 0;.  sq
ae80: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
ae90: 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ter;.  sqlite3_f
aea0: 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20  ile *pJournal;. 
aeb0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
aec0: 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
aed0: 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
aee0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
aef0: 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
af00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
af10: 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
af30: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
af40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
af50: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
af60: 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72   case some other
af70: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
af80: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f   running this ro
af90: 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20  utine also. Not 
afa0: 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f  that it makes to
afb0: 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63  o much differenc
afc0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  e..  */.  pMaste
afd0: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
afe0: 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
aff0: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
b000: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
b010: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
b020: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
b030: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
b040: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
b050: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
b060: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b070: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
b080: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
b090: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
b0a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
b0b0: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
b0c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
b0d0: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
b0e0: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
b0f0: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
b100: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b110: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
b120: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
b130: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
b140: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b150: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
b160: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
b170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b180: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
b190: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
b1a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
b1b0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
b1c0: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
b1d0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
b1e0: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
b1f0: 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  tr = pPager->pVf
b200: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
b210: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
b220: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
b230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
b240: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
b250: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
b260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
b270: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
b280: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
b290: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
b2a0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
b2b0: 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ar *)sqlite3Mall
b2c0: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
b2d0: 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  l + nMasterPtr);
b2e0: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
b2f0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
b300: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
b310: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
b320: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b330: 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72     }.    zMaster
b340: 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
b350: 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
b360: 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20  rnal];.    rc = 
b370: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
b380: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
b390: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
b3a0: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69  urnal, 0);.    i
b3b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b3c0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
b3d0: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
b3e0: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
b3f0: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
b400: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
b410: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
b420: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
b430: 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
b440: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b450: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
b460: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
b470: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
b480: 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
b490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b4a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
b4b0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
b4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b4d0: 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
b4e0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
b4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
b500: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
b510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
b520: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
b530: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
b540: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
b550: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
b560: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
b570: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
b580: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
b590: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b5a0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
b5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
b5c0: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
b5d0: 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
b5e0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
b5f0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
b600: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
b610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
b620: 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
b630: 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
b640: 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
b650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b660: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b670: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b680: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
b690: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
b6a0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
b6b0: 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
b6c0: 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
b6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b6e0: 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
b6f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b700: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b710: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
b720: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
b730: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b740: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
b750: 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
b760: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
b770: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
b780: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
b790: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
b7a0: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
b7b0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
b7c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
b7d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
b7e0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
b7f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b800: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
b810: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75   += (strlen(zJou
b820: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
b830: 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
b840: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
b850: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
b860: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
b870: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
b880: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
b890: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
b8a0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
b8b0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
b8c0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
b8d0: 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
b8e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
b8f0: 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
b900: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b910: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b920: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
b930: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
b940: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
b950: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
b960: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
b970: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
b980: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
b990: 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75  icated. Also tru
b9a0: 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64  ncate the cached
b9b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
b9c0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  of the file..**.
b9d0: 2a 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62  ** Might might b
b9e0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
b9f0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
ba00: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
ba10: 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20   nPage..** This 
ba20: 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
ba30: 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61  example, if we a
ba40: 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  re in the middle
ba50: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
ba60: 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65  n.** which has e
ba70: 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65  xtended the file
ba80: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65   size and the ne
ba90: 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69 6c  w pages are stil
baa0: 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e  l all held.** in
bab0: 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20   cache, then an 
bac0: 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
bad0: 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e   does a statemen
bae0: 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d  t rollback.  Som
baf0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
bb00: 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
bb10: 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
bb20: 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74 72  nfused if you tr
bb30: 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65  y to.** truncate
bb40: 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
bb50: 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
bb60: 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72 72  ger than it curr
bb70: 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20  ently is,.** so 
bb80: 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
bb90: 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
bba0: 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
bbb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bbc0: 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  new.** file inst
bbd0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ead..*/.static i
bbe0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
bbf0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
bc00: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
bc10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bc20: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
bc30: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
bc40: 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65  CLUSIVE && pPage
bc50: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
bc60: 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
bc70: 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
bc80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
bc90: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
bca0: 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
bcb0: 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
bcc0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
bcd0: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
bce0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
bcf0: 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
bd00: 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
bd10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
bd20: 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
bd40: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
bd50: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
bd60: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
bd70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
bd80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
bd90: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
bda0: 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
bdb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bdc0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
bdd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
bde0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
bdf0: 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
be00: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
be10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
be20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be30: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
be40: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
be50: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
be60: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
be70: 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62  is at least as b
be80: 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72  ig as the sector
be90: 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a   size reported.*
bea0: 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  * by sqlite3OsSe
beb0: 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65  ctorSize().  The
bec0: 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20   minimum sector 
bed0: 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a  size is 512..*/.
bee0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
bef0: 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
bf00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
bf10: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
bf20: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
bf30: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
bf40: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
bf50: 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
bf60: 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
bf70: 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
bf80: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
bf90: 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
bfa0: 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
bfb0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
bfc0: 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20  , in whcih case 
bfd0: 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
bfe0: 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
bff0: 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
c000: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
c010: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
c020: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
c030: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
c040: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
c050: 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
c060: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
c070: 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
c080: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
c090: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
c0a0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
c0b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
c0c0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
c0d0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
c0e0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
c0f0: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
c100: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
c110: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
c120: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
c130: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
c140: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
c150: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
c160: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
c170: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
c180: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
c190: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
c1a0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
c1b0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
c1c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
c1d0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
c1e0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
c1f0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
c200: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
c210: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
c220: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
c230: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
c240: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
c250: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c260: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
c270: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
c280: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
c290: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
c2a0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
c2b0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
c2c0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
c2d0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
c2e0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
c2f0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
c300: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
c310: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
c320: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c330: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
c340: 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
c350: 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
c360: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
c370: 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
c380: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
c390: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c3a0: 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20   page case..**  
c3b0: 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (7)  4 byte inte
c3c0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c3d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c3e0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
c3f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
c400: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
c410: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
c420: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
c430: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
c440: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
c450: 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74  ).**  (8)  N byt
c460: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
c470: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
c480: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
c490: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
c4a0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
c4b0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
c4c0: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
c4d0: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
c4e0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
c4f0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
c500: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
c510: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
c520: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
c530: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
c540: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
c550: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
c560: 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f  8..**  (9)  Zero
c570: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
c580: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
c590: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
c5a0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
c5b0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
c5c0: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
c5d0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
c5e0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
c5f0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
c600: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
c610: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
c620: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
c630: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
c640: 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65  st 8 items above
c650: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
c660: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c670: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
c680: 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a   the 9th item..*
c690: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
c6a0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
c6b0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
c6c0: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
c6d0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
c6e0: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
c6f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
c700: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
c710: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
c720: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
c730: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
c740: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c750: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
c760: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
c770: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
c780: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
c790: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
c7a0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
c7b0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
c7c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c7d0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
c7e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
c7f0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
c800: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
c810: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
c820: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
c830: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
c840: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
c850: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
c860: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
c870: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
c880: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
c890: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
c8a0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
c8b0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
c8c0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
c8d0: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
c8e0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
c8f0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
c900: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
c910: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
c920: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
c930: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
c940: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
c950: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
c960: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
c970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
c980: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
c990: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
c9a0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
c9b0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
c9c0: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
c9d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
c9e0: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
c9f0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
ca00: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
ca10: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
ca20: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
ca30: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
ca40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca50: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
ca60: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
ca70: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
ca80: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
ca90: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
caa0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
cab0: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
cac0: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
cad0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
cae0: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
caf0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
cb00: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
cb10: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
cb20: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
cb30: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
cb40: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
cb50: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
cb60: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
cb70: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
cb80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
cb90: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
cba0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
cbb0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
cbc0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
cbd0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
cbe0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
cbf0: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
cc00: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
cc10: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
cc20: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cc40: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
cc50: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
cc60: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc80: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
cc90: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
cca0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
ccd0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
cce0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
ccf0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
cd00: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
cd10: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
cd20: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
cd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
cd40: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
cd50: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
cd60: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
cd70: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
cd80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
cd90: 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
cda0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
cdb0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
cdc0: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
cdd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
cde0: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
cdf0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
ce00: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
ce10: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
ce20: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
ce30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
ce40: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
ce50: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ce60: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
ce70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
ce80: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
ce90: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
cea0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ceb0: 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
cec0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ced0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
cee0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cef0: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
cf00: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
cf10: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
cf20: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cf30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cf40: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
cf50: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
cf60: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
cf70: 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
cf80: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
cf90: 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
cfa0: 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
cfb0: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
cfc0: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
cfd0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
cfe0: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
cff0: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
d000: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
d010: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
d020: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
d030: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d040: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
d050: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
d060: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
d070: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
d080: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
d090: 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
d0a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
d0b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
d0c0: 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
d0d0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d0e0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
d0f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
d100: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
d110: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
d120: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
d130: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
d140: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
d150: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
d160: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
d170: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
d180: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
d190: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
d1a0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
d1b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
d1c0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
d1d0: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
d1e0: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
d1f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
d200: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
d210: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
d220: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
d230: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
d240: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
d250: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
d260: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
d270: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
d280: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
d290: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
d2a0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
d2b0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
d2c0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
d2d0: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
d2e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
d2f0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d300: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
d310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d320: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
d330: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
d340: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
d350: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
d360: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
d370: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
d380: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
d390: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
d3a0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
d3b0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
d3c0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
d3d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
d3e0: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
d3f0: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
d400: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
d410: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
d420: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
d430: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
d440: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
d450: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
d460: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
d470: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
d480: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d490: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
d4a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d4b0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
d4c0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
d4d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4e0: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
d4f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
d500: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
d510: 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
d520: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
d530: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
d540: 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
d550: 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
d560: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
d570: 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
d580: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
d590: 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
d5a0: 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
d5b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
d5c0: 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
d5d0: 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
d5e0: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
d5f0: 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
d600: 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
d610: 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
d620: 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
d630: 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
d640: 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
d650: 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
d660: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
d670: 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
d680: 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
d690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d6a0: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
d6b0: 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
d6c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
d6d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d6e0: 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
d6f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
d700: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
d710: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
d720: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
d730: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
d740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
d750: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
d760: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
d770: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
d780: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
d790: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
d7a0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
d7b0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
d7c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
d7d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
d7e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d7f0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
d800: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
d810: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
d820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d840: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
d850: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
d860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
d870: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d880: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
d890: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
d8a0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
d8b0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
d8c0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
d8d0: 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; u++){.      r
d8e0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d8f0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d900: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
d910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d920: 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  Off, 1);.      i
d930: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d940: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d950: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
d960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
d970: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d980: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
d990: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d9a0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
d9b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
d9d0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
d9e0: 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  o rollback, then
d9f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
da00: 20 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20   probably.      
da10: 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20      ** going to 
da20: 65 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72  end up being cor
da30: 72 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72  rupt.  It is cor
da40: 72 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68  rupt to us, anyh
da50: 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ow..          **
da60: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
da70: 74 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  t process to com
da80: 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20  e along can fix 
da90: 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20  it.....         
daa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
dab0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
dac0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dad0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
dae0: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
daf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
db00: 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
db10: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
db20: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
db30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
db40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
db50: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
db60: 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
db70: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
db80: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
db90: 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
dba0: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
dbb0: 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e+1);.  }.  if( 
dbc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dbd0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
dbe0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
dbf0: 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
dc00: 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20  0]!='\0');.  }. 
dc10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dc20: 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
dc30: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
dc40: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
dc50: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
dc60: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
dc70: 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
dc80: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
dc90: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
dca0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
dcb0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
dcc0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
dcd0: 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
dce0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  , zMaster);.  }.
dcf0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
dd00: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
dd10: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
dd20: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
dd30: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
dd40: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
dd50: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
dd60: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
dd70: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
dd80: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
dd90: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
dda0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
ddb0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
ddc0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
ddd0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
dde0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
ddf0: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
de00: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
de10: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
de20: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
de30: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
de40: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
de50: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
de60: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
de70: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
de80: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
de90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dea0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
deb0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
dec0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
ded0: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
dee0: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
def0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
df00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
df10: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
df20: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
df30: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
df40: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
df50: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
df60: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
df70: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
df80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
df90: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
dfa0: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
dfb0: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
dfc0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
dfd0: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
dfe0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
dff0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
e000: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
e010: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
e020: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
e030: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
e040: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
e050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e060: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
e070: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e090: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e0a0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
e0b0: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
e0c0: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53  rnalOff;..  /* S
e0d0: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
e0e0: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
e0f0: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
e100: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
e110: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
e120: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
e130: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
e140: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
e150: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
e160: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
e170: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
e180: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
e190: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
e1a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e1b0: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
e1c0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
e1d0: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
e1e0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
e1f0: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
e200: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
e210: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
e220: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
e230: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
e240: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
e250: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
e260: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
e270: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
e280: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
e290: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
e2a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e2b0: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
e2c0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e2d0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
e2e0: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
e2f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
e300: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
e310: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
e320: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
e330: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63  alOpen );.  nRec
e340: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
e350: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
e360: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
e370: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
e380: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
e390: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
e3a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e3b0: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
e3c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e3d0: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
e3e0: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
e3f0: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
e400: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
e410: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
e420: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
e430: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
e440: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
e450: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
e460: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
e470: 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d  t = i*(4+pPager-
e480: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
e490: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
e4a0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
e4b0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
e4c0: 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20  d, offset, 0);. 
e4d0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e4e0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e4f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e500: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e510: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e520: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
e530: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
e540: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
e550: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
e560: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
e570: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
e580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e590: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
e5a0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
e5b0: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
e5c0: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
e5d0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
e5e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
e5f0: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
e600: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
e610: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
e620: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
e630: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
e640: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
e650: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
e660: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
e670: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
e680: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
e690: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
e6a0: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
e6b0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
e6c0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
e6d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
e6e0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
e6f0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
e700: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
e710: 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65  mtCksum;.  while
e720: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e730: 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
e740: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
e750: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
e760: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
e770: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
e780: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
e790: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e7a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e7c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e7d0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e7e0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
e7f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
e800: 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
e810: 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
e820: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
e830: 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
e840: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
e850: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
e860: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
e870: 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
e880: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
e890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e8a0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e8b0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e8c0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
e8d0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
e8e0: 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
e8f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
e900: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
e910: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
e920: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
e930: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
e940: 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
e950: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
e960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
e970: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
e980: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
e990: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
e9a0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
e9b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e9c0: 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  ff, 1);.      as
e9d0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e9e0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
e9f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ea00: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
ea10: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
ea20: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
ea30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
ea40: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
ea50: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
ea60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
ea70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ea80: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
ea90: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
eaa0: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
eab0: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
eac0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
ead0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
eae0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
eaf0: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
eb00: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
eb10: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
eb20: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
eb30: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
eb40: 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
eb50: 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
eb60: 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
eb70: 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
eb80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
eb90: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
eba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ebb0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
ebc0: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
ebd0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
ebe0: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
ebf0: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
ec00: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
ec10: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
ec20: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
ec30: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
ec40: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
ec50: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
ec60: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
ec70: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
ec80: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
ec90: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
eca0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
ecb0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
ecc0: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
ecd0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
ece0: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
ecf0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
ed00: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
ed10: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
ed20: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
ed30: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
ed40: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
ed50: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
ed60: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
ed70: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
ed80: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
ed90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
eda0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
edb0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
edc0: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
edd0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
ede0: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
edf0: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
ee00: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
ee10: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
ee30: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
ee40: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
ee50: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
ee60: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
ee70: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
ee80: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
eea0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
eeb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
eec0: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
eed0: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
eee0: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
eef0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ef00: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
ef10: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
ef20: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
ef30: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
ef40: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
ef50: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
ef60: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
ef70: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
ef80: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
ef90: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
efb0: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
efc0: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
efd0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
efe0: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
eff0: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
f000: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
f010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
f020: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
f030: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
f040: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
f050: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
f060: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
f070: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
f080: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
f090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
f0a0: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
f0b0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
f0c0: 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
f0d0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
f0e0: 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
f0f0: 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
f100: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
f110: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
f120: 6d 70 46 69 6c 65 20 7c 7c 20 4d 45 4d 44 42 3b  mpFile || MEMDB;
f130: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
f140: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
f150: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
f160: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ile;.  pPager->s
f170: 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
f180: 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
f190: 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
f1a0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
f1b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
f1c0: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
f1d0: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
f1e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
f1f0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
f200: 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
f210: 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
f220: 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
f230: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
f240: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
f250: 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
f260: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
f270: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
f280: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
f290: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
f2a0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
f2b0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
f2c0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
f2d0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
f2e0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
f2f0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
f300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
f310: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
f320: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f330: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
f340: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
f350: 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
f360: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
f370: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
f380: 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
f390: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
f3a0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
f3b0: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
f3c0: 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
f3d0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f3e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
f3f0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
f400: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
f410: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
f420: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
f430: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
f440: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
f450: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
f460: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
f470: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f480: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f490: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
f4a0: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
f4b0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
f4c0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
f4d0: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
f4e0: 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
f4f0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
f500: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
f510: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
f520: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
f530: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
f540: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
f550: 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
f560: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
f570: 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
f580: 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
f590: 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
f5a0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f5b0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   || pFile->pMeth
f5c0: 6f 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ods );.  return 
f5d0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
f5e0: 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
f5f0: 69 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a  id *,PgHdr *);..
f600: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f610: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
f620: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
f630: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
f640: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
f650: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
f660: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
f670: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
f680: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
f690: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
f6a0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
f6b0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
f6c0: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
f6d0: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
f6e0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
f6f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
f700: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
f710: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
f720: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
f730: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
f740: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
f750: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
f760: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
f770: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
f780: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
f790: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
f7a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
f7b0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
f7c0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f7d0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
f7e0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
f7f0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
f800: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
f810: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
f820: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
f830: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
f840: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
f850: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
f860: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
f870: 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
f880: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
f890: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
f8a0: 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
f8b0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
f8c0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
f8d0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
f8e0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f8f0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
f900: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
f910: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
f920: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f930: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
f940: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
f950: 50 61 67 65 2a 29 2c 20 20 2f 2a 20 50 61 67 65  Page*),  /* Page
f960: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
f970: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  tion */.  int nE
f980: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
f990: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
f9a0: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
f9b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
f9c0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9e0: 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
f9f0: 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
fa00: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
fa10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
fa20: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
fa30: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
fa40: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
fa50: 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
fa60: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
fa70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fa80: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
fa90: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
faa0: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
fab0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
fac0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
fad0: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
fae0: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
faf0: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
fb00: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
fb10: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
fb20: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
fb30: 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
fb40: 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a  eSize = sqlite3J
fb50: 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
fb60: 3b 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  ;.  int pcacheSi
fb70: 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
fb80: 68 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20  heSize();.  int 
fb90: 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
fba0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
fbb0: 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
fbc0: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
fbd0: 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
fbe0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  0;..  /* The def
fbf0: 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20 61  ault return is a
fc00: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f   NULL pointer */
fc10: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
fc20: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
fc30: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
fc40: 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
fc50: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
fc60: 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
fc70: 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
fc80: 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
fc90: 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
fca0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
fcb0: 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
fcc0: 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
fcd0: 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
fce0: 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
fcf0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
fd00: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
fd10: 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
fd20: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
fd30: 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
fd40: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
fd50: 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
fd60: 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
fd70: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
fd80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fd90: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
fda0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
fdb0: 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
fdc0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
fdd0: 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
fde0: 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
fdf0: 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
fe00: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 73 65  ] = 0;.      use
fe10: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
fe20: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
fe30: 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73    {.      rc = s
fe40: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
fe50: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
fe60: 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
fe70: 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
fe80: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
fe90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fea0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
feb0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
fec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fed0: 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  }.    nPathname 
fee0: 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61  = strlen(zPathna
fef0: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
ff00: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
ff10: 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
ff20: 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
ff30: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
ff40: 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
ff50: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
ff60: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
ff70: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
ff80: 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20    pcacheSize    
ff90: 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
ffa0: 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
ffb0: 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
ffc0: 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
ffd0: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
ffe0: 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
fff0: 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
10000 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20  OsFile * 3 +    
10010 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
10020 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e  db and two journ
10030 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
10040 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   3*nPathname + 4
10050 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
10060 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
10070 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20  ctory, zJournal 
10080 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
10090 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
100a0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
100b0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
100c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
100d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43   }.  pPager->pPC
100e0 61 63 68 65 20 3d 20 28 50 43 61 63 68 65 20 2a  ache = (PCache *
100f0 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
10100 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26 70 50  Ptr = ((u8 *)&pP
10110 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61 63 68  ager[1]) + pcach
10120 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  eSize;.  pPager-
10130 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
10140 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lags;.  pPager->
10150 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
10160 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
10170 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70  szOsFile*0];.  p
10180 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73  Pager->stfd = (s
10190 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
101a0 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
101b0 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*1];.  pPager->
101c0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
101d0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
101e0 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20  >szOsFile*2];.  
101f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
10200 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72  e = (char*)&pPtr
10210 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
10220 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  2+journalFileSiz
10230 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  e];.  pPager->zD
10240 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
10250 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
10260 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
10270 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
10280 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
10290 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  tory[nPathname+1
102a0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
102b0 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20  s = pVfs;.  if( 
102c0 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
102d0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
102e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
102f0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
10300 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
10310 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
10320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
10330 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
10340 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
10350 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
10360 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
10370 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e  {.    if( nPathn
10380 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74  ame>(pVfs->mxPat
10390 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22  hname - sizeof("
103a0 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20  -journal")) ){. 
103b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
103c0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
103d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
103e0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
103f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
10400 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
10410 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
10420 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20  er->fd,.        
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
10450 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  s, &fout);.     
10460 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
10470 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
10480 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20  ADONLY);..      
10490 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
104a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
104b0 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
104c0 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
104d0 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
104e0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
104f0 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
10500 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
10510 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
10520 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
10530 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
10540 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
10550 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10560 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
10570 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
10580 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  ,.      **    + 
10590 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
105a0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
105b0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
105c0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
105d0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
105e0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
105f0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
10600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10620 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
10630 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65  .        int iSe
10640 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
10650 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
10660 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
10670 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
10680 6c 74 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  lt<iSectorSize )
10690 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
106a0 67 65 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72  geDflt = iSector
106b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
106c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
106d0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
106e0 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
106f0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
10700 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
10710 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
10720 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
10730 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
10740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
10750 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
10760 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
10770 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
10780 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
10790 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
107a0 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
107b0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
107c0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
107d0 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
107e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
107f0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
10800 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
10810 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
10820 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
10830 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
10840 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
10850 7c 28 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61  |(ii>>8)) ) szPa
10860 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
10870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10880 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
10890 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
108a0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
108b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
108c0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
108d0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
108e0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
108f0 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
10900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10910 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62  }else if( !memDb
10920 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
10930 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
10940 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
10950 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
10960 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
10970 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
10980 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
10990 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
109a0 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
109b0 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
109c0 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
109d0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
109e0 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
109f0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
10a00 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
10a10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10a20 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
10a30 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
10a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10a50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
10a60 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10a70 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a 50 61  3PageMalloc(szPa
10a80 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20  geDflt);.  }..  
10a90 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
10aa0 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
10ab0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
10ac0 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
10ad0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
10ae0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
10af0 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
10b00 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
10b10 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
10b20 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
10b30 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
10b40 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
10b50 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
10b60 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
10b70 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10b80 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
10b90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
10ba0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
10bb0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
10bc0 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
10bd0 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
10be0 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
10bf0 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  .  nExtra = FORC
10c00 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
10c10 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
10c20 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
10c30 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
10c40 6d 44 62 2c 20 78 44 65 73 63 2c 20 0a 20 20 20  mDb, xDesc, .   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
10c70 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
10c80 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
10c90 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
10ca0 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
10cb0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
10cc0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
10cd0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10ce0 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
10cf0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
10d00 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
10d10 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
10d20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
10d30 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
10d40 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
10d50 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
10d60 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
10d70 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
10d80 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
10d90 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10da0 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
10db0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
10dc0 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
10dd0 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
10de0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
10df0 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
10e00 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
10e10 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20  rnal[] */.  if( 
10e20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
10e30 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
10e40 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
10e50 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
10e60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
10e70 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
10e80 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
10e90 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
10ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
10eb0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
10ec0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70  = 0;.  }..  /* p
10ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10ee0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
10ef0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
10f00 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  = useJournal;.  
10f10 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
10f20 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
10f30 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
10f40 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
10f50 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
10f60 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
10f70 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
10f80 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
10f90 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
10fa0 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
10fb0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
10fc0 7a 65 20 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b  ze = szPageDflt;
10fd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
10fe0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
10ff0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
11000 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
11010 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
11020 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
11030 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b  r->mxPage = 100;
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
11050 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
11060 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
11070 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11080 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
11090 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
110a0 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
110b0 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
110c0 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
110d0 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20  UNLOCK) );.  /* 
110e0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
110f0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11100 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
11110 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
11120 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
11130 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
11140 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
11150 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
11160 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
11170 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
11180 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
11190 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
111a0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
111b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
111c0 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50   tempFile; .  pP
111d0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
111e0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
111f0 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
11200 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
11210 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
11220 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
11230 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
11240 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
11250 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
11260 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
11270 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
11280 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
11290 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
112a0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
112b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
112c0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
112d0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
112e0 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
112f0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
11300 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
11310 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a  Extra = nExtra;.
11320 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11330 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
11340 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
11350 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
11360 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
11370 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d  >fd->pMethods||m
11380 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b  emDb||tempFile);
11390 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
113a0 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69  .    setSectorSi
113b0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
113c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
113d0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
113e0 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
113f0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
11400 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
11410 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
11420 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
11430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
11450 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11460 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
11470 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
11480 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
11490 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
114a0 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
114b0 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
114c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
114d0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
114e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
114f0 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
11500 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
11510 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
11520 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
11530 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
11540 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
11550 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
11560 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
11570 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
11580 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
11590 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
115a0 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
115b0 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
115c0 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
115d0 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
115e0 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
115f0 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
11600 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
11610 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
11620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
11630 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
11640 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
11650 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
11660 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61 67 65  Page*)){.  pPage
11670 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
11680 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
11690 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
116a0 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  ze to *pPageSize
116b0 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74  . If the suggest
116c0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 69   new page size i
116d0 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61  s.** inappropria
116e0 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
116f0 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
11700 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61 74  e is set to that
11710 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65  .** value before
11720 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
11730 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
11740 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
11750 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
11760 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
11770 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
11780 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d  rCode;.  if( rc=
11790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
117a0 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
117b0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
117c0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
117d0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
117e0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
117f0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11800 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
11810 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
11820 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
11830 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
11840 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65    && (pPager->me
11850 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
11860 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
11870 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
11880 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
11890 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
118a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
118b0 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
118c0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
118d0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
118e0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
118f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
11900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11920 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
11930 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
11940 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11950 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
11960 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
11970 3e 6d 65 6d 44 62 20 29 20 73 65 74 53 65 63 74  >memDb ) setSect
11980 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
11990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
119a0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
119b0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
119c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
119d0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
119e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
119f0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
11a00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
11a10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11a20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
11a30 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
11a40 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
11a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11a60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
11a70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
11a80 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
11a90 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
11aa0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
11ab0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
11ac0 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
11ad0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
11ae0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
11af0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
11b00 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
11b10 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
11b20 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
11b30 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
11b40 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
11b50 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
11b60 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
11b70 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
11b80 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
11b90 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
11ba0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
11bb0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
11bc0 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
11bd0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
11be0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
11bf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
11c00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
11c10 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
11c20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
11c30 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
11c40 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
11c50 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11c60 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
11c70 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
11c80 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
11c90 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
11ca0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
11cb0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
11cc0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
11cd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
11ce0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11cf0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
11d00 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
11d10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
11d20 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
11d30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11d40 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11d50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11d60 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
11d70 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
11d80 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11d90 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
11da0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
11db0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
11dc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
11dd0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
11de0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
11df0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
11e00 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
11e10 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
11e20 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
11e30 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
11e40 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
11e50 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
11e60 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
11e70 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
11e80 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
11e90 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
11ea0 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
11eb0 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
11ec0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
11ed0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
11ee0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
11ef0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
11f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11f10 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
11f20 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11f30 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
11f40 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
11f50 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
11f60 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
11f70 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
11f80 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11f90 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
11fa0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
11fb0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
11fc0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
11fd0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
11fe0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
11ff0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12000 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
12010 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
12020 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
12030 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
12040 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
12050 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12060 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
12070 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12080 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
12090 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
120a0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
120b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
120c0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
120d0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
120e0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
120f0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
12100 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
12110 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
12120 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
12130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
12140 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
12150 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
12160 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
12170 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
12180 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
12190 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
121a0 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
121b0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
121c0 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
121d0 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
121e0 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
121f0 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
12200 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
12210 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
12220 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
12230 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
12240 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
12250 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
12260 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
12270 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
12280 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
12290 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
122a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
122b0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
122c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
122d0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
122e0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45   N);.  assert(ME
122f0 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d  MDB||pPager->fd-
12300 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
12310 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12320 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
12330 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
12340 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
12350 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
12360 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
12370 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
12380 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
12390 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
123a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
123b0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
123c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
123d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
123e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
123f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12400 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
12410 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
12420 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
12430 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
12440 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
12450 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
12460 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
12470 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
12480 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12490 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
124a0 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
124b0 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
124c0 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
124d0 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
124e0 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
124f0 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
12500 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
12510 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
12520 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
12530 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
12540 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
12550 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
12560 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12570 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12580 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
12590 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
125a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
125b0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
125c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
125d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
125e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
125f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12600 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
12610 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
12620 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
12630 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
12640 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
12650 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
12660 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12670 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
12680 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
12690 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
126a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
126b0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
126c0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
126d0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
126e0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
126f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12710 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
12720 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12730 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
12740 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
12750 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
12760 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12770 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
12780 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
12790 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
127a0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
127b0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
127c0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
127d0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
127e0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
127f0 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
12800 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12810 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
12820 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
12830 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
12840 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12850 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12860 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
12870 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
12880 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12890 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
128a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
128b0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
128c0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
128d0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
128e0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
128f0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
12900 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
12910 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
12920 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
12930 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
12940 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
12950 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
12960 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
12970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12980 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
12990 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
129a0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
129b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
129c0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
129d0 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
129e0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
129f0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
12a00 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
12a10 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
12a20 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
12a30 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
12a40 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
12a50 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
12a60 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
12a70 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
12a80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12a90 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12aa0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12ab0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
12ac0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
12ad0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
12ae0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
12af0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
12b00 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
12b10 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
12b20 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
12b30 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
12b40 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
12b50 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
12b60 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
12b70 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
12b80 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
12b90 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
12ba0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
12bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12bc0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
12bd0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
12be0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
12bf0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
12c00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12c10 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
12c20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12c30 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
12c40 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
12c50 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
12c60 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
12c70 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
12c80 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
12c90 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
12ca0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
12cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
12cc0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
12cd0 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
12ce0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
12cf0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
12d00 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
12d10 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
12d20 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
12d30 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
12d40 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
12d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
12d60 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12d70 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
12d80 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20  er->dbSize<0 || 
12d90 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
12da0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
12db0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
12dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
12de0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12df0 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70  dler ) pPager->p
12e00 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75  BusyHandler->nBu
12e10 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b  sy = 0;.    do {
12e20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12e30 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
12e40 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
12e50 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
12e60 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
12e70 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
12e80 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
12e90 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
12ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12ec0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
12ed0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20   locktype;.     
12ee0 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
12ef0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
12f00 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
12f10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12f20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
12f30 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
12f40 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
12f50 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
12f60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12f70 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
12f80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
12f90 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
12fa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12fc0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
12fd0 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
12fe0 0a 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ...  sqlite3Page
12ff0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
13000 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  r, 0);.  if( pPa
13010 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
13020 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
13030 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
13040 65 20 69 66 28 20 6e 50 61 67 65 3c 28 75 6e 73  e if( nPage<(uns
13050 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
13060 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
13070 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
13080 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
13090 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 61 67  nPage;.      pag
130a0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
130b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  e(pPager);.    }
130c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
130d0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
130e0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
130f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13100 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
13110 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13120 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
13130 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
13140 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
13150 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
13160 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
13170 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
13180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
131a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
131b0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
131c0 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
131d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
131e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
131f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
13200 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13210 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
13220 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
13230 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
13240 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
13250 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
13260 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
13270 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
13280 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
13290 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
132a0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
132b0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
132c0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
132d0 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
132e0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
132f0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
13300 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
13310 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
13320 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
13330 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
13340 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
13350 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
13360 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
13370 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
13380 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
13390 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
133a0 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
133b0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
133c0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
133d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
133e0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
133f0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
13400 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
13410 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
13420 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
13430 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
13440 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
13450 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13460 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
13470 67 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65  ger){..  disable
13480 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13490 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
134a0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
134b0 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
134c0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
134d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
134e0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
134f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
13500 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
13510 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
13520 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
13530 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
13540 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
13550 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13560 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
13570 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
13580 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
13590 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
135a0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
135b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
135c0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
135d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
135e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
135f0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13600 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13610 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73  pInJournal);.  s
13620 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
13630 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  roy(pPager->pAlw
13640 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  aysRollback);.  
13650 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
13660 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
13670 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13680 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
13690 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
136a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
136b0 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
136c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
136d0 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
136e0 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
136f0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
13700 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
13710 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
13720 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
13730 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61   */..  sqlite3Pa
13740 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
13750 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
13760 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
13770 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13780 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13790 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
137a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
137b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
137c0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
137d0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
137e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
137f0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
13800 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
13810 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
13820 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
13830 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
13840 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
13850 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13860 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
13870 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
13880 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
13890 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
138a0 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
138b0 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
138c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
138d0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
138e0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
138f0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
13900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13910 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
13920 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
13930 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13940 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
13950 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
13960 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
13970 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
13980 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
13990 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
139a0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
139b0 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
139c0 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
139d0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
139e0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
139f0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
13a00 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
13a10 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
13a20 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
13a30 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
13a40 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13a50 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
13a60 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
13a70 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
13a80 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
13a90 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
13aa0 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
13ab0 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
13ac0 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
13ad0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
13ae0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
13af0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
13b00 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
13b10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
13b20 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
13b30 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
13b40 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
13b50 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
13b60 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
13b70 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
13b80 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
13b90 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13ba0 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
13bb0 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
13bc0 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
13bd0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
13be0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
13bf0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
13c00 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
13c10 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
13c20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
13c30 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
13c40 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
13c50 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
13c60 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
13c70 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
13c80 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
13c90 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
13ca0 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
13cb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
13cc0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
13cd0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
13ce0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
13cf0 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
13d00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13d10 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
13d20 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
13d30 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
13d40 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
13d50 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
13d60 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
13d70 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
13d80 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
13d90 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
13da0 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
13db0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
13dc0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
13dd0 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
13de0 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
13df0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
13e00 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
13e10 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
13e20 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
13e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13e40 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
13e50 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
13e60 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
13e70 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
13e80 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
13e90 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
13ea0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
13eb0 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
13ec0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13ed0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
13ee0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13ef0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
13f00 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
13f10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
13f20 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13f40 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
13f50 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
13f60 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
13f70 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
13f80 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
13f90 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13fa0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
13fb0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
13fc0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
13fd0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
13fe0 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
13ff0 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
14000 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
14010 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
14020 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
14030 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
14040 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
14050 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
14060 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
14070 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
14080 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
14090 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
140a0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
140b0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
140c0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
140d0 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
140e0 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
140f0 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
14100 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
14110 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14120 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
14130 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
14140 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
14150 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
14160 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
14170 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
14180 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
14190 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
141a0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
141b0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
141c0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
141d0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
141e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
141f0 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20  i64 jrnlOff;.   
14200 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
14210 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
14220 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
14230 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
14240 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
14250 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
14260 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
14270 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
14280 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
14290 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
142a0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
142b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
142c0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
142d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
142e0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  c_flags);.      
142f0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
14300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14310 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72     }..        jr
14320 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
14330 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
14340 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
14350 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c);.        IOTR
14360 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
14370 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
14380 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a  , jrnlOff, 4));.
14390 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
143a0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
143b0 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
143c0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
143d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
143e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
143f0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
14400 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
14410 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
14420 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
14430 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
14440 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
14450 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14460 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14470 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
14480 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
14490 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
144a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
144b0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
144c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
144d0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
144e0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
144f0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
14500 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
14510 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
14520 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
14530 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
14540 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14550 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
14560 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14570 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
14580 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
14590 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
145a0 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
145b0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
145c0 65 33 50 63 61 63 68 65 43 6c 65 61 72 46 6c 61  e3PcacheClearFla
145d0 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
145e0 68 65 2c 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  he, PGHDR_NEED_S
145f0 59 4e 43 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  YNC);.  }..#ifnd
14600 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
14610 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
14620 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
14630 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
14640 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
14650 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
14660 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
14670 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
14680 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
14690 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
146a0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
146b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 41    sqlite3PcacheA
146c0 73 73 65 72 74 46 6c 61 67 73 28 70 50 61 67 65  ssertFlags(pPage
146d0 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50  r->pPCache, 0, P
146e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
146f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
14700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14710 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
14720 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
14730 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
14740 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
14750 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
14760 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
14770 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
14780 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20  tabase file. No 
14790 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
147a0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  * to the page-ca
147b0 63 68 65 20 74 6f 20 6d 61 72 6b 20 74 68 65 20  che to mark the 
147c0 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 20  pages as clean. 
147d0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
147e0 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
147f0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65  he caller to use
14800 20 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28   PcacheCleanAll(
14810 29 20 6f 72 20 50 63 61 63 68 65 4d 61 6b 65 43  ) or PcacheMakeC
14820 6c 65 61 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a  lean() to mark.*
14830 2a 20 74 68 65 20 70 61 67 65 73 20 61 73 20 63  * the pages as c
14840 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
14850 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
14860 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
14870 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
14880 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
14890 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
148a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
148b0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
148c0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
148d0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
148e0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
148f0 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
14900 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
14910 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
14920 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
14930 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
14940 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
14950 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
14960 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
14970 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
14980 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
14990 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
149a0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
149b0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
149c0 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
149d0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
149e0 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
149f0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
14a00 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
14a10 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
14a20 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
14a30 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
14a40 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
14a50 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
14a60 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
14a70 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
14a80 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
14a90 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
14aa0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
14ab0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
14ac0 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
14ad0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
14ae0 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
14af0 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
14b00 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
14b10 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
14b20 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
14b30 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14b40 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
14b50 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
14b60 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
14b70 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
14b80 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
14b90 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
14ba0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14bb0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
14bc0 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
14bd0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
14be0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
14bf0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
14c00 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
14c10 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
14c20 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
14c30 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
14c40 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
14c50 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
14c60 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
14c70 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
14c80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14c90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14ca0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
14cb0 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
14cc0 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
14cd0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
14ce0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
14cf0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
14d00 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
14d10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14d20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14d30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14d40 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
14d50 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
14d60 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
14d70 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  fsFlags);.      
14d80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14d90 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
14da0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
14db0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
14dc0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
14dd0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
14de0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
14df0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
14e00 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
14e10 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
14e20 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
14e30 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
14e40 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
14e50 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
14e60 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
14e70 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
14e80 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
14e90 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
14ea0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14eb0 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
14ec0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
14ed0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
14ee0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
14ef0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
14f00 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
14f10 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
14f20 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
14f30 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
14f40 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
14f50 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
14f60 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
14f70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
14f80 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
14f90 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
14fa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14fb0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
14fc0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
14fd0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
14fe0 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
14ff0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
15000 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
15010 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
15020 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15030 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
15040 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
15050 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15060 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
15070 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
15080 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
15090 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
150a0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
150b0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
150c0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
150d0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
150e0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
150f0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
15100 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
15110 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
15120 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
15130 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
15140 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
15150 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
15160 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
15170 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
15180 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
15190 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
151a0 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
151b0 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
151c0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
151d0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
151e0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
151f0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
15200 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
15210 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
15220 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
15230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15240 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15250 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
15260 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
15270 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
15280 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
15290 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
152a0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
152b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
152c0 75 72 67 65 61 62 6c 65 20 50 61 67 65 72 20 0a  urgeable Pager .
152d0 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
152e0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
152f0 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67  s to make a sing
15300 6c 65 20 64 69 72 74 79 20 70 61 67 65 20 74 68  le dirty page th
15310 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74  at has no.** out
15320 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
15330 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78 69 73  ces (if one exis
15340 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74 68 61  ts) clean so tha
15350 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 63 79  t it can be recy
15360 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  cled .** by the 
15370 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f  pcache layer..*/
15380 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15390 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
153a0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
153b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
153c0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
153d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
153e0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
153f0 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20  >doNotSync ){.  
15400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15410 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
15420 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
15430 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 69  HDR_DIRTY );.  i
15440 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15450 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
15460 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
15470 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
15480 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20  YNC ){.      rc 
15490 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
154a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
154b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
154c0 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
154d0 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21  nc && .        !
154e0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
154f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
15500 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
15510 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
15520 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20  PEND).      ){. 
15530 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
15540 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
15550 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
15560 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
15570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
155a0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
155b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
155c0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
155d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
155e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
155f0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
15600 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
15610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
15640 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
15650 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
15660 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
15670 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
15680 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
15690 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
156a0 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
156b0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
156c0 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
156d0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
156e0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
156f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
15700 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
15710 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
15720 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
15730 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
15740 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
15750 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
15760 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
15770 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
15780 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
15790 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
157a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  *.** Return nega
157b0 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74  tive if unable t
157c0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
157d0 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f  status of the jo
157e0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
157f0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
15800 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ot open the jour
15810 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  nal file to exam
15820 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65  ine its.** conte
15830 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  nt.  Hence, the 
15840 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
15850 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
15860 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  f a master.** jo
15870 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
15880 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
15890 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20  , and hence not 
158a0 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74  be hot.  Or.** t
158b0 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
158c0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62   journal might b
158d0 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54  e zeroed out.  T
158e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
158f0 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72  oes not discover
15900 20 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20   these cases of 
15910 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61  a non-hot journa
15920 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f  l - if the.** jo
15930 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
15940 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70  s and is not emp
15950 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ty this routine 
15960 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73  assumes it.** is
15970 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72   hot.  The pager
15980 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
15990 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
159a0 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f  r that the.** jo
159b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
159c0 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
159d0 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   will no-op..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
159f0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
15a00 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
15a10 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
15a20 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
15a30 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
15a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15a50 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20  .  int exists;. 
15a60 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61   int locked;.  a
15a70 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
15a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15a90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
15aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15ab0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15ac0 64 73 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73  ds );.  *pExists
15ad0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
15ae0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
15af0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15b00 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
15b10 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
15b20 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
15b30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
15b40 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ts ){.    rc = s
15b50 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
15b60 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
15b70 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
15b80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15b90 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
15ba0 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  s && !locked ){.
15bb0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
15bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15bd0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15be0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
15bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28  E_OK ){.     if(
15c10 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
15c20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
15c30 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
15c40 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
15c50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15c60 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
15c70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15c80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15c90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
15ca0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
15cb0 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
15cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15cd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15ce0 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
15cf0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15d00 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
15d10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
15d20 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
15d30 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
15d40 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
15d50 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
15d60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15d70 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
15d80 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
15d90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15da0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
15db0 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
15dc0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
15dd0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
15de0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
15df0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15e00 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
15e10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15e20 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50  ze, offset);.  P
15e30 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
15e40 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
15e50 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
15e60 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
15e70 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
15e80 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
15e90 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
15ea0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
15eb0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15ec0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15ed0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
15ee0 61 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  a)[24],.        
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
15f20 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
15f30 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
15f40 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
15f50 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
15f60 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
15f70 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
15f80 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
15f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15fa0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
15fb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67  , pPg->pgno, pag
15fc0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
15fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15fe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
15ff0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16000 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
16010 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
16020 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
16030 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
16040 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
16050 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
16060 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
16070 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
16080 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
16090 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
160a0 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
160b0 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
160c0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
160d0 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
160e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
160f0 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
16100 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
16110 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
16120 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
16130 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
16140 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
16150 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
16160 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
16170 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
16180 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
161a0 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30  isErrorReset = 0
161b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
161c0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
161d0 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
161e0 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
161f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
16200 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
16210 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
16220 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
16230 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
16240 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
16250 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
16260 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
16270 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
16280 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
16290 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
162a0 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
162b0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
162c0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
162d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
162e0 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
162f0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
16300 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
16310 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
16320 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69  Code .  ){.    i
16330 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
16340 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
16350 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
16360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
16370 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
16380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
16390 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
163a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
163b0 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
163c0 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
163d0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
163e0 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
163f0 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
16400 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
16410 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
16420 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
16430 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
16440 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
16450 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
16460 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
16470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
16480 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
16490 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
164a0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
164b0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
164c0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
164d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
164e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
164f0 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
16500 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
16510 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
16520 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
16530 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
16540 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
16550 72 6e 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  rnal;.      asse
16560 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
16570 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
16580 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
16590 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
165a0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
165b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
165c0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
165d0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
165e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
165f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
16610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16620 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
16630 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CK );.          
16640 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16650 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16680 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
16690 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
166a0 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
166b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
166c0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
166d0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
166e0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
166f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16700 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
16710 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
16720 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
16730 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
16740 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f       if( !isErro
16750 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
16760 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
16770 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
16780 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
16790 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
167a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
167b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
167c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
167d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 45   }.      if( isE
167e0 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
167f0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
16800 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
16810 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16830 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
16840 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20  t it is.        
16850 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
16860 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
16870 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
16880 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
16890 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45  the.        ** E
168a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
168b0 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
168c0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
168d0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
168e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
168f0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16900 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
16910 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
16920 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
16930 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
16940 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
16950 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
16960 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
16970 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e          ** back.
16980 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
16990 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
169a0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
169b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
169c0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
169d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
169e0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
169f0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
16a00 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
16a10 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
16a20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
16a30 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
16a40 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16a50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
16a60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16a70 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16a80 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
16a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
16aa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16ab0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16ac0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
16b00 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16b10 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
16b20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
16b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16b40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
16b50 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
16b60 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
16b70 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
16b80 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16b90 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
16ba0 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
16bb0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
16bc0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
16bd0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
16be0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
16bf0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
16c00 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
16c10 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
16c20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
16c30 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
16c40 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
16c50 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
16c60 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
16c70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
16c80 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
16c90 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
16ca0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
16cb0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
16cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16cd0 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
16ce0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t && pPager->jou
16cf0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  rnalOpen==0 ){. 
16d00 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73           int res
16d10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16d20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
16d30 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
16d40 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
16d50 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
16d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
16d90 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
16da0 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
16db0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
16dc0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
16dd0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16de0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
16df0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
16e00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16e10 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16e20 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16e40 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
16e50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
16e60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
16e70 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
16e80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
16e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
16ea0 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
16eb0 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
16ec0 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51       if( fout&SQ
16ed0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16ee0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
16ef0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16f00 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16f20 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
16f30 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
16f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16f70 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
16f80 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
16f90 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
16fa0 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
16fb0 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
16fc0 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
16fd0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
16fe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16ff0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
17000 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
17010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
17050 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
17060 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20  TE_IOERR_UNLOCK 
17070 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72  .           && r
17080 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
17090 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 20  NOMEM .         
170a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
170b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
170c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
170d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
170e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
170f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
17100 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
17110 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17120 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
17130 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
17140 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
17150 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
17160 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
17170 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
17180 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
17190 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
171a0 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
171b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
171c0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
171d0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
171e0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
171f0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
17200 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
17210 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
17220 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
17230 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
17240 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17260 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
17270 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
17280 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
17290 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
172a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
172b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
172c0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
172d0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
172e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
172f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
17300 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
17310 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17320 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
17330 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
17340 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
17350 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
17360 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
17370 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
17380 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
17390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
173a0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
173b0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
173c0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
173d0 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
173e0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
173f0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
17400 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
17410 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17420 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
17430 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
17440 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
17450 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
17460 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
17470 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
17480 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
17490 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
174a0 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
174b0 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
174c0 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
174d0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
174e0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
174f0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
17500 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
17510 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
17520 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
17530 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
17540 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
17550 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
17560 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
17570 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
17580 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
17590 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
175a0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
175b0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
175c0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
175d0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
175e0 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
175f0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
17600 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
17610 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
17620 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
17630 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
17640 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
17650 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
17660 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
17670 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
17680 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
17690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
176a0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
176b0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
176c0 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
176d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
176e0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
176f0 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  0);..        if(
17700 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17720 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17730 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  de;.          go
17740 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
17750 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
17760 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17770 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
17780 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
17790 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
177a0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
177b0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
177c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
177d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
177e0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
177f0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17800 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
17810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17830 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17860 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
17870 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
17880 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
17890 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
178a0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
178b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
178c0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
178d0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
178e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
178f0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17900 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
17910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17930 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
17940 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
17950 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
17960 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17970 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
17980 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
17990 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
179a0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
179b0 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64    }.  }.. failed
179c0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
179d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
179e0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
179f0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78  s a no-op for ex
17a00 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
17a10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
17a20 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ases. */.    pag
17a30 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
17a40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
17a60 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
17a70 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
17a80 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
17a90 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
17aa0 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
17ab0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
17ac0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
17ad0 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
17ae0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
17af0 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
17b00 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
17b10 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
17b20 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
17b30 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
17b40 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
17b50 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
17b60 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
17b70 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
17b80 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
17b90 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
17ba0 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
17bb0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
17bc0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
17bd0 45 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69  ED_READ ){.    i
17be0 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
17bf0 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
17c00 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
17c10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17c30 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
17c40 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
17c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17c70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17c90 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
17ca0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
17cb0 61 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20  ached zero, and 
17cc0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
17cd0 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c   in the.** middl
17ce0 65 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61  e of a write tra
17cf0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e  nsaction or open
17d00 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ed in exclusive 
17d10 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e  mode, unlock it.
17d20 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
17d30 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
17d40 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
17d50 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
17d60 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
17d70 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
17d80 65 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21  e)==0).    && (!
17d90 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17da0 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
17db0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
17dc0 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
17dd0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
17de0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
17df0 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67  /*.** Drop a pag
17e00 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  e from the cache
17e10 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63   using sqlite3Pc
17e20 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a  acheDrop()..**.*
17e30 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  * If this means 
17e40 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  there are now no
17e50 20 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65   pages with refe
17e60 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20  rences to them, 
17e70 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
17e80 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
17e90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17ea0 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  e is removed..*/
17eb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
17ec0 65 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67  erDropPage(DbPag
17ed0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
17ee0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
17ef0 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
17f00 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
17f10 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  ;.  pagerUnlockI
17f20 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
17f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
17f40 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
17f50 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
17f60 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
17f70 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
17f80 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
17f90 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
17fa0 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
17fb0 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
17fc0 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
17fd0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
17fe0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
17ff0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
18000 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
18010 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
18020 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
18030 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
18040 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
18050 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
18060 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
18070 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
18080 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
18090 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
180a0 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
180b0 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
180c0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
180d0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
180e0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
180f0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
18100 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
18110 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
18120 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
18130 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
18140 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
18150 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
18160 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
18170 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
18180 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18190 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
181a0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
181b0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
181c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
181d0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
181e0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
181f0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
18200 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
18210 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
18220 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
18230 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
18240 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
18250 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
18260 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
18270 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
18280 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
18290 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
182a0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
182b0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
182c0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
182d0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
182e0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
182f0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
18300 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
18310 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
18320 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
18330 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
18340 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
18350 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
18360 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
18370 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
18380 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
18390 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
183a0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
183b0 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
183c0 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
183d0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
183e0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
183f0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
18400 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
18410 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
18420 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
18430 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
18440 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
18450 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
18460 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
18470 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
18480 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
18490 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
184a0 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
184b0 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
184c0 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
184d0 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
184e0 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
184f0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
18500 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
18510 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
18520 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
18530 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
18540 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
18550 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18560 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
18570 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
18580 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
18590 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
185a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
185b0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
185c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
185d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
185e0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
185f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
18600 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
18610 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
18620 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
18630 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
18640 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
18650 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18660 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
18670 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
18680 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
18690 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
186a0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
186b0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
186c0 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
186d0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
186e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
186f0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
18700 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
18710 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
18720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
18730 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67  >0 .       || pg
18740 6e 6f 3d 3d 31 20 0a 20 20 29 3b 0a 0a 20 20 2f  no==1 .  );..  /
18750 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
18760 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
18770 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
18780 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
18790 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
187a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
187b0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
187c0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
187d0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
187e0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
187f0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
18800 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18810 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18820 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18830 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
18840 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
18850 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
18860 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
18870 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
18880 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
18890 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Page = 0;..  /* 
188a0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
188b0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
188c0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
188d0 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
188e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
188f0 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
18900 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
18910 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
18920 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
18930 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
18940 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
18950 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
18960 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
18980 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
18990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
189a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
189b0 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  K );..  rc = sql
189c0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
189d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
189e0 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b   pgno, 1, &pPg);
189f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18a10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
18a20 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
18a30 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
18a40 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
18a50 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
18a60 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
18a70 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
18a80 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
18a90 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d     */.    int nM
18aa0 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ax;.    PAGER_IN
18ab0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
18ac0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
18ad0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
18ae0 20 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76   if( sqlite3Bitv
18af0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
18b00 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
18b10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
18b20 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
18b30 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
18b40 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
18b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
18b60 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61 2c 20  et(pPg->pExtra, 
18b70 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
18b80 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  a);..    rc = sq
18b90 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18ba0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
18bb0 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
18bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18bd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
18be0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
18bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18c00 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  }..    if( nMax<
18c10 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
18c20 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  DB || noContent 
18c30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
18c40 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
18c50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18c60 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
18c70 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
18c80 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
18c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
18ca0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
18cb0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
18cc0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
18cd0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
18ce0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
18cf0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 52   |= PGHDR_NEED_R
18d00 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EAD;.      }.   
18d10 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
18d20 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
18d30 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
18d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18d50 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61  = readDbPage(pPa
18d60 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b  ger, pPg, pgno);
18d70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18d80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
18d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18da0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
18db0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50 61 67     /* sqlite3Pag
18dc0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f  erUnref(pPg); */
18dd0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 44 72  .        pagerDr
18de0 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  opPage(pPg);.   
18df0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
18e10 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
18e20 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
18e30 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
18e40 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
18e50 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18e60 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
18e70 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
18e80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18e90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 73   */.    assert(s
18ea0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
18eb0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
18ec0 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d  ache)>0 || pgno=
18ed0 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  =1);.    PAGER_I
18ee0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
18ef0 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f  );.    if( !noCo
18f00 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
18f10 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
18f20 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20  ntent(pPg);.    
18f30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18f40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18f50 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18f60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18f80 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ..  *ppPage = pP
18f90 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
18fa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18fb0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
18fc0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
18fd0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
18fe0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
18ff0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
19000 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
19010 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
19020 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
19030 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
19040 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
19050 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
19060 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19070 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
19080 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
19090 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
190a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
190b0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
190c0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
190d0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
190e0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
190f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
19100 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
19110 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
19120 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
19130 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19140 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
19150 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
19160 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
19170 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
19180 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
19190 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
191a0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
191b0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
191c0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
191d0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
191e0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
191f0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
19200 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
19210 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  CK).   && (pPage
19220 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
19230 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19240 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
19250 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20  _FULL).  ){.    
19260 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
19270 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
19280 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
19290 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
192a0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
192b0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
192c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
192d0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
192e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
192f0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
19300 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
19310 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
19320 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
19330 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
19340 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
19350 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
19360 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
19370 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
19380 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
19390 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
193a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
193b0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
193c0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
193d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
193e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
193f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
19400 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
19410 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
19420 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
19430 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19440 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
19450 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
19460 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
19470 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
19480 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
19490 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
194a0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
194b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
194c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
194d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
194e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
194f0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
19500 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
19510 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
19520 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
19530 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
19540 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
19550 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19560 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
19570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19580 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19590 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
195a0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
195b0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
195c0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
195d0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
195e0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
195f0 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
19600 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
19610 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19620 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
19630 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
19640 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
19650 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
19660 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
19670 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
19680 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
19690 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
196a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
196b0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
196c0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
196d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
196e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
196f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
19700 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19710 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
19720 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
19730 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rnal;.  }..  if(
19740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19750 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Open==0 ){.    i
19760 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
19770 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ile ){.      fla
19780 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
19790 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
197a0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
197b0 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  P_JOURNAL);.    
197c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61  }else{.      fla
197d0 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
197e0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
197f0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
19800 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
19810 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72 63  MIC_WRITE.    rc
19820 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
19830 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70  lOpen(.        p
19840 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
19850 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
19860 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
19870 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
19880 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20  ).    );.#else. 
19890 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
198a0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
198b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
198c0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
198d0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
198e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
198f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
19900 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
19910 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
19920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
19930 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
19940 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
19950 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
19960 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
19970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19980 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19990 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
199a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
199b0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
199c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
199d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
199e0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
199f0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  en_journal;.    
19a00 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  }.  }.  pPager->
19a10 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
19a20 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
19a30 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
19a40 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
19a50 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
19a60 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
19a70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19a80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
19a90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
19aa0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
19ab0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
19ac0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
19ad0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
19ae0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
19af0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
19b00 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
19b10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
19b20 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
19b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19b40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19b50 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
19b60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
19b80 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
19b90 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
19ba0 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
19bb0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
19bc0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
19bd0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  r, 0);.    if( r
19be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19bf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19c00 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
19c10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
19c20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
19c30 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
19c40 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
19c50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
19c60 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
19c70 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
19c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19c90 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
19ca0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
19cb0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
19cc0 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
19cd0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
19ce0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19cf0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
19d00 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
19d10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
19d20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
19d30 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  *  sqlite3PagerR
19d40 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
19d50 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
19d60 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
19d70 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
19d80 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19d90 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  Unref() is calle
19da0 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
19db0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
19dc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
19dd0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
19de0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
19df0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
19e00 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
19e10 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
19e20 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
19e30 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
19e40 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
19e50 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
19e60 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
19e70 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
19e80 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
19e90 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
19ea0 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
19eb0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
19ec0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
19ed0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
19ee0 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
19ef0 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
19f00 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
19f10 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
19f20 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
19f30 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
19f40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
19f50 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
19f60 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
19f70 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
19f80 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
19f90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19fa0 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
19fb0 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
19fc0 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
19fd0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
19fe0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
19ff0 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
1a000 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
1a010 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1a020 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1a030 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1a040 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
1a050 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
1a060 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1a070 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
1a080 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
1a090 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
1a0a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1a0b0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
1a0c0 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
1a0d0 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
1a0e0 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
1a0f0 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
1a100 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
1a110 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
1a120 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
1a130 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
1a140 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1a150 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69  n(DbPage *pPg, i
1a160 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61  nt exFlag){.  Pa
1a170 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1a180 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1a190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a1a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1a1b0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
1a1c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1a1d0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1a1e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1a1f0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1a200 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
1a210 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1a220 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1a230 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 41 73   sqlite3PcacheAs
1a240 73 65 72 74 46 6c 61 67 73 28 70 50 61 67 65 72  sertFlags(pPager
1a250 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50 47  ->pPCache, 0, PG
1a260 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  HDR_IN_JOURNAL);
1a270 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1a280 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1a290 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
1a2a0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70  CLUSIVE;.      p
1a2b0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a2c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1a2d0 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
1a2e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a2f0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1a300 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
1a310 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
1a320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a330 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1a340 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
1a350 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
1a360 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
1a370 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1a380 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1a390 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1a3a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1a3b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a3c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a3d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1a3e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1a3f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
1a400 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
1a410 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
1a420 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
1a430 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1a440 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
1a450 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1a460 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
1a470 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20  empFile.        
1a480 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1a490 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1a4a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1a4b0 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  FF ){.        rc
1a4c0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1a4d0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1a4e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a4f0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1a500 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1a510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a520 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1a530 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1a540 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1a550 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1a560 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
1a570 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
1a580 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
1a590 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1a5a0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
1a5b0 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
1a5c0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1a5d0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
1a5e0 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
1a5f0 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
1a600 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
1a610 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
1a620 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1a630 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
1a640 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
1a650 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
1a660 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
1a670 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a680 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1a690 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
1a6a0 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
1a6b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a6c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1a6d0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1a6e0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a6f0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Pager, 0);.    p
1a700 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1a710 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
1a720 63 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d  cCreate( pPager-
1a730 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  >dbSize );.    i
1a740 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  f( !pPager->pInJ
1a750 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1a760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a770 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1a780 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1a790 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1a7a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1a7b0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1a7c0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1a7d0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1a7e0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1a7f0 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1a800 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1a810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a820 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a830 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1a840 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20  age dirty.  Set 
1a850 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61  its dirty flag a
1a860 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
1a870 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c   dirty.** page l
1a880 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
1a890 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67  oid makeDirty(Pg
1a8a0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  Hdr *pPg){.  sql
1a8b0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
1a8c0 72 74 79 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  rty(pPg);.}../*.
1a8d0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63  ** Make a page c
1a8e0 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73  lean.  Clear its
1a8f0 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72   dirty bit and r
1a900 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1a910 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
1a920 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1a930 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
1a940 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 73 71  gHdr *pPg){.  sq
1a950 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
1a960 6c 65 61 6e 28 70 50 67 29 3b 0a 7d 0a 0a 0a 2f  lean(pPg);.}.../
1a970 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
1a980 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
1a990 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
1a9a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1a9b0 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
1a9c0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1a9d0 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
1a9e0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
1a9f0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
1aa00 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
1aa10 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
1aa20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1aa30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1aa40 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
1aa50 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
1aa60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
1aa70 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
1aa80 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1aa90 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
1aaa0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
1aab0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
1aac0 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
1aad0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1aae0 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
1aaf0 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
1ab00 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
1ab10 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
1ab20 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
1ab30 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
1ab40 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
1ab50 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
1ab60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1ab70 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
1ab80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ab90 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
1aba0 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
1abb0 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
1abc0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
1abd0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1abe0 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
1abf0 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1ac00 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
1ac10 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
1ac20 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
1ac30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1ac40 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
1ac50 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
1ac60 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ac70 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61  t() or sqlite3Pa
1ac80 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  gerRollback() to
1ac90 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74  .** reset..*/.st
1aca0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
1acb0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
1acc0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
1acd0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
1ace0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1acf0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1ad00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ad10 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
1ad20 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
1ad30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ad40 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
1ad50 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1ad60 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1ad70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
1ad80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ad90 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
1ada0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1adb0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
1adc0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1add0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
1ade0 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
1adf0 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1ae00 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1ae10 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
1ae20 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
1ae30 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
1ae40 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1ae50 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
1ae60 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
1ae70 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
1ae80 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
1ae90 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
1aea0 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
1aeb0 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
1aec0 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
1aed0 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
1aee0 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
1aef0 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
1af00 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
1af10 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1af20 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
1af30 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
1af40 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
1af50 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
1af60 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
1af70 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
1af80 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1af90 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
1afa0 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
1afb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1afc0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
1afd0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
1afe0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
1aff0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1b000 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
1b010 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
1b020 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
1b030 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
1b040 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1b050 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
1b060 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  gs&PGHDR_IN_JOUR
1b070 4e 41 4c 29 0a 20 20 20 26 26 20 28 70 61 67 65  NAL).   && (page
1b080 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1b090 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
1b0a0 49 6e 55 73 65 3d 3d 30 29 20 0a 20 20 29 7b 0a  InUse==0) .  ){.
1b0b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1b0c0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
1b0d0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
1b0e0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
1b0f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
1b100 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
1b110 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1b120 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
1b130 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
1b140 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1b150 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
1b160 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
1b170 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
1b180 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
1b190 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
1b1a0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
1b1b0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1b1c0 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
1b1d0 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
1b1e0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
1b1f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1b200 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b210 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1b220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b230 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
1b240 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1b250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b260 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b270 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1b280 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1b290 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1b2a0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1b2b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1b2c0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1b2d0 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26  nal.          &&
1b2e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b2f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1b300 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
1b310 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b320 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1b330 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1b340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b360 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1b370 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20  tyCache = 1;.   
1b380 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
1b390 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
1b3a0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1b3b0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
1b3c0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
1b3d0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
1b3e0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1b3f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b400 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1b410 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
1b420 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
1b430 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
1b440 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
1b450 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1b460 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1b470 0a 20 20 20 20 69 66 28 20 21 28 70 50 67 2d 3e  .    if( !(pPg->
1b480 66 6c 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a  flags&PGHDR_IN_J
1b490 4f 55 52 4e 41 4c 29 20 26 26 20 28 70 50 61 67  OURNAL) && (pPag
1b4a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1b4b0 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
1b4c0 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
1b4d0 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1b4e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1b4f0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
1b500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
1b510 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e  GERTRACE3("JOURN
1b520 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1b530 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b540 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1b550 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1b560 6c 69 74 65 33 50 63 61 63 68 65 50 72 65 73 65  lite3PcachePrese
1b570 72 76 65 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  rve(pPg, 0);.   
1b580 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b5a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b5b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
1b5c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b5d0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1b5e0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  m;.          cha
1b5f0 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
1b600 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1b610 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1b620 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b630 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1b640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1b650 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1b660 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1b670 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1b680 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1b690 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1b6a0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1b6b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1b6c0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1b6d0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1b6e0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1b6f0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1b700 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1b710 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1b720 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1b730 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1b740 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1b750 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b760 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1b770 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1b780 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
1b790 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
1b7a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b7b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1b7c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1b7d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1b7e0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1b7f0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b820 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
1b830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1b840 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b850 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
1b860 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
1b870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1b880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b8a0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1b8b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1b8c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b8d0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
1b8e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b8f0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
1b900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b910 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b920 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1b930 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1b940 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1b960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b970 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b980 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  e));.          P
1b990 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1b9a0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
1b9b0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ount);.         
1b9c0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f   PAGERTRACE5("JO
1b9d0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1b9e0 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
1b9f0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1ba00 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1ba10 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1ba20 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
1ba30 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
1ba40 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1ba50 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
1ba60 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1ba70 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ..          /* A
1ba80 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1ba90 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
1baa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1bab0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   The .          
1bac0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
1bad0 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
1bae0 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
1baf0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20  above..         
1bb00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1bb10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bb20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1bb30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1bb40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1bb50 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
1bb60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1bb70 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1bb80 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1bb90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
1bba0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1bbb0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
1bbc0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1bbd0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1bbe0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1bbf0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1bc00 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
1bc10 43 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  C;.          }. 
1bc20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
1bc30 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1bc40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1bc50 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
1bc60 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
1bc70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1bc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bc90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1bca0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
1bcb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1bcc0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
1bcd0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
1bce0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1bcf0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1bd00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bd10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1bd20 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1bd30 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1bd40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bd50 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1bd60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1bd80 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1bd90 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1bda0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bdb0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
1bdc0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1bdd0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1bde0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1bdf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1be00 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
1be10 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  DR_IN_JOURNAL;. 
1be20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
1be30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1be40 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
1be50 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
1be60 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
1be70 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
1be80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1be90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1bea0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
1beb0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
1bec0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1bed0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
1bee0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
1bef0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
1bf00 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
1bf10 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
1bf20 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
1bf30 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
1bf40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1bf50 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
1bf60 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1bf70 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
1bf80 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1bf90 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1bfa0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1bfb0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
1bfc0 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  s&PGHDR_IN_JOURN
1bfd0 41 4c 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  AL) .           
1bfe0 20 20 20 20 20 20 7c 7c 20 28 69 6e 74 29 70 50        || (int)pP
1bff0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1c000 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1c010 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1c020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1c030 6c 69 74 65 33 50 63 61 63 68 65 50 72 65 73 65  lite3PcachePrese
1c040 72 76 65 28 70 50 67 2c 20 31 29 3b 0a 20 20 20  rve(pPg, 1);.   
1c050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c070 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c090 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
1c0a0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1c0b0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1c0c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1c0d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
1c0e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1c0f0 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1c100 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61  >stmtNRec*(4+pPa
1c110 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c120 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1c130 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1c140 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1c150 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1c160 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1c170 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66  bits(pPager->stf
1c180 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
1c190 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
1c1a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c1c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c1d0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1c1e0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1c1f0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c200 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +4);.        }. 
1c210 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1c220 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1c230 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c240 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c250 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c260 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c2a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1c2b0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
1c2c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1c2d0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
1c2e0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
1c2f0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  Set(pPager->pInS
1c300 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  tmt, pPg->pgno);
1c310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c320 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1c330 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1c340 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
1c350 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c360 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c370 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
1c380 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1c390 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
1c3a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1c3b0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
1c3c0 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
1c3d0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
1c3e0 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
1c3f0 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
1c400 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
1c410 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
1c420 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c430 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1c450 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61  sed to mark a da
1c460 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61  ta-page as writa
1c470 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a  ble. It uses .**
1c480 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74   pager_write() t
1c490 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  o open a journal
1c4a0 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20   file (if it is 
1c4b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1c4c0 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  ).** and write t
1c4d0 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74  he page *pData t
1c4e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1c4f0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
1c500 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1c510 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
1c520 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
1c530 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
1c540 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
1c550 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1c560 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
1c570 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
1c580 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
1c590 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
1c5a0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
1c5b0 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
1c5c0 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
1c5d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1c5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
1c5f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1c610 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
1c620 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
1c630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c640 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1c650 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1c660 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1c670 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
1c680 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
1c690 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
1c6a0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
1c6b0 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d  Size);..  if( !M
1c6c0 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
1c6d0 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
1c6e0 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
1c6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c700 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1c710 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
1c720 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
1c730 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
1c740 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1c750 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1c760 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1c770 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
1c780 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1c790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c7a0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
1c7b0 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
1c7c0 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
1c7d0 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
1c7e0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
1c7f0 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
1c800 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
1c810 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
1c820 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
1c830 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
1c840 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
1c850 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
1c860 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
1c870 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1c880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c890 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1c8a0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
1c8b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1c8c0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
1c8d0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
1c8e0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
1c8f0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
1c900 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
1c910 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
1c920 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
1c930 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
1c940 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
1c950 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
1c960 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1c970 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
1c980 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
1c990 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
1c9a0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
1c9b0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
1c9c0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
1c9d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1c9e0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
1c9f0 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
1ca00 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
1ca10 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
1ca20 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
1ca30 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
1ca40 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
1ca50 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
1ca60 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
1ca70 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1ca80 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
1ca90 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
1caa0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1cab0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
1cac0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1cad0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
1cae0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
1caf0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
1cb00 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
1cb10 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
1cb20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1cb30 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1cb40 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
1cb50 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
1cb60 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
1cb70 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
1cb80 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1cb90 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
1cba0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
1cbb0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
1cbc0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
1cbd0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1cbe0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1cbf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cc00 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1cc10 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1cc20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1cc30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cc40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1cc50 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1cc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1cc70 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
1cc80 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1cc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1cca0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1ccb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ccc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1ccd0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
1cce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ccf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1cd00 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
1cd10 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1cd20 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
1cd30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1cd40 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
1cd50 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_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 7d 0a 20 20   1;.        }.  
1cd80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1cd90 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1cda0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1cdb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48     /* If the PgH
1cdc0 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
1cdd0 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
1cde0 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
1cdf0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
1ce00 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
1ce10 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1ce20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
1ce30 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
1ce40 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
1ce50 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
1ce60 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
1ce70 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
1ce80 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
1ce90 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
1cea0 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
1ceb0 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
1cec0 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
1ced0 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
1cee0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
1cef0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1cf00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
1cf10 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b   if( needSync ){
1cf20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1cf30 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1cf40 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
1cf50 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1cf60 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
1cf70 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
1cf80 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
1cf90 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1cfa0 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
1cfb0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1cfc0 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  e ) pPage->flags
1cfd0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
1cfe0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  YNC;.        sql
1cff0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1d000 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1d010 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1d020 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
1d030 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1d040 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1d050 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
1d060 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1d070 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1d080 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1d090 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
1d0a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d0b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1d0c0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
1d0d0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1d0e0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
1d0f0 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
1d100 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d110 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
1d120 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
1d130 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
1d140 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
1d150 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1d160 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
1d170 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
1d180 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1d190 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
1d1a0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
1d1b0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
1d1c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d1d0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1d1e0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1d1f0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1d200 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1d210 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1d220 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1d230 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
1d240 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
1d250 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
1d260 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
1d270 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
1d280 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
1d290 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
1d2a0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
1d2b0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
1d2c0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
1d2d0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
1d2e0 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
1d2f0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
1d300 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
1d310 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
1d320 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
1d330 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
1d340 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
1d350 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
1d360 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
1d370 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
1d380 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1d390 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
1d3a0 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
1d3b0 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
1d3c0 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
1d3d0 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
1d3e0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
1d3f0 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
1d400 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
1d410 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
1d420 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
1d430 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
1d440 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
1d450 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1d460 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d470 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
1d480 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
1d490 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
1d4a0 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
1d4b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
1d4c0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
1d4d0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
1d4e0 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
1d4f0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
1d500 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
1d510 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
1d520 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
1d530 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
1d540 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
1d550 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
1d560 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1d570 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
1d580 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1d590 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1d5a0 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1d5b0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1d5c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d5d0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1d5e0 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
1d5f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1d600 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
1d610 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
1d620 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
1d630 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
1d640 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
1d650 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
1d660 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
1d670 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1d680 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
1d690 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1d6a0 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1d6b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1d6c0 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
1d6d0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
1d6e0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1d6f0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1d700 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1d710 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1d720 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50   if( MEMDB || pP
1d730 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1d740 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1d750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d760 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1d770 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d780 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  lback==0 ){.    
1d790 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d7a0 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
1d7b0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79    pPager->pAlway
1d7c0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  sRollback = sqli
1d7d0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
1d7e0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d7f0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ze);.    if( !pP
1d800 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d810 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  lback ){.      r
1d820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1d830 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
1d840 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1d850 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41  ecSet(pPager->pA
1d860 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70  lwaysRollback, p
1d870 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  Pg->pgno);..  if
1d880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d890 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
1d8a0 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 21  GHDR_DIRTY) && !
1d8b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d8c0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1d8d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1d8e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1d8f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d900 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
1d910 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
1d920 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
1d930 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
1d940 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1d950 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
1d960 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
1d970 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
1d980 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
1d990 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
1d9a0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1d9b0 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
1d9c0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d9d0 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
1d9e0 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
1d9f0 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
1da00 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
1da10 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1da20 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
1da30 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
1da40 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
1da50 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
1da60 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
1da70 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
1da80 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
1da90 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
1daa0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1dab0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
1dac0 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
1dad0 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
1dae0 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
1daf0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
1db00 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
1db10 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
1db20 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
1db30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
1db40 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
1db50 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1db60 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1db70 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1db80 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1db90 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1dba0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
1dbb0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1dbc0 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e  no)).      pPg->
1dbd0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
1dbe0 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
1dbf0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1dc00 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
1dc10 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1dc20 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
1dc30 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1dc40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dc50 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1dc60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1dc70 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1dc80 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
1dc90 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
1dca0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1dcb0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
1dcc0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
1dcd0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
1dce0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1dcf0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
1dd00 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
1dd10 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
1dd20 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
1dd30 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1dd40 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
1dd50 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
1dd60 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1dd70 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
1dd80 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
1dd90 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
1dda0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ddb0 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
1ddc0 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
1ddd0 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
1dde0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
1ddf0 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
1de00 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
1de10 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
1de20 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
1de30 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
1de40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1de50 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1de60 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1de70 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1de80 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1de90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dea0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1deb0 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ED );..  /* If t
1dec0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ded0 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
1dee0 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
1def0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20  been called on. 
1df00 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28 44   ** this page (D
1df10 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73 20  ontWrite() sets 
1df20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1df30 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74  ck flag), then t
1df40 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1df50 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  n is a no-op..  
1df60 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1df70 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1df80 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  .   || sqlite3Bi
1df90 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
1dfa0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1dfb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20  , pPg->pgno).   
1dfc0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1dfd0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 0a  ger->origDbSize.
1dfe0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
1dff0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1e000 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46  MEMDB );    /* F
1e010 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67  or a memdb, pPag
1e020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1e030 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a  is always 0 */..
1e040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
1e050 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
1e060 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ( (pPg->flags & 
1e070 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
1e080 29 21 3d 30 20 7c 7c 20 28 69 6e 74 29 70 50 67  )!=0 || (int)pPg
1e090 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1e0a0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1e0b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
1e0c0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43  dif..  /* If SEC
1e0d0 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69  URE_DELETE is di
1e0e0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1e0f0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  re is no way tha
1e100 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74  t this.  ** rout
1e110 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
1e120 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20  d on a page for 
1e130 77 68 69 63 68 20 73 71 6c 69 74 65 33 50 61 67  which sqlite3Pag
1e140 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20  erDontWrite().  
1e150 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
1e160 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1e170 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d  d during the sam
1e180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1e190 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57   ** And if DontW
1e1a0 72 69 74 65 28 29 20 68 61 73 20 70 72 65 76 69  rite() has previ
1e1b0 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65  ously been calle
1e1c0 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d, the following
1e1d0 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  .  ** conditions
1e1e0 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20   must be met..  
1e1f0 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29  **.  ** (Later:)
1e200 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20    Not true.  If 
1e210 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e220 63 6f 72 72 75 70 74 65 64 20 62 79 20 68 61 76  corrupted by hav
1e230 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20  ing duplicate.  
1e240 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  ** pages on the 
1e250 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f  freelist (ex: co
1e260 72 72 75 70 74 39 2e 74 65 73 74 29 20 74 68 65  rrupt9.test) the
1e270 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1e280 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
1e290 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20  ssarily true:.  
1e2a0 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  */.  /* assert( 
1e2b0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1e2c0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1e2d0 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1e2e0 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20  gDbSize ); */.. 
1e2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e300 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
1e310 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
1e320 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1e330 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
1e340 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67  no);.  pPg->flag
1e350 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  s |= PGHDR_IN_JO
1e360 55 52 4e 41 4c 3b 0a 20 20 70 50 67 2d 3e 66 6c  URNAL;.  pPg->fl
1e370 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
1e380 45 44 5f 52 45 41 44 3b 0a 20 20 69 66 28 20 70  ED_READ;.  if( p
1e390 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e3a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e3b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1e3c0 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   >= pPager->orig
1e3d0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71  DbSize );.    sq
1e3e0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
1e3f0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
1e400 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
1e410 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1e420 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
1e430 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1e440 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1e450 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
1e460 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
1e470 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1e480 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a  , pPg->pgno)).}.
1e490 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e4a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1e4b0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1e4c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1e4d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1e4e0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1e4f0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1e500 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1e510 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1e520 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1e530 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1e540 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
1e550 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1e560 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1e570 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1e580 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66  ITE_OK;..#ifndef
1e590 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1e5a0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 61 73  TOMIC_WRITE.  as
1e5b0 73 65 72 74 28 20 69 73 44 69 72 65 63 74 3d 3d  sert( isDirect==
1e5c0 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72 65 63  0 );  /* isDirec
1e5d0 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66  t is only true f
1e5e0 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74 65 73  or atomic writes
1e5f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   */.#endif.  if(
1e600 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
1e610 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20  CountDone ){.   
1e620 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
1e630 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
1e640 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
1e650 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e660 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
1e670 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
1e680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e690 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1e6a0 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20    if( !isDirect 
1e6b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1e6c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e6d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69  pPgHdr);.      i
1e6e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e700 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1e710 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72  gHdr);.        r
1e720 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e730 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e740 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1e750 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1e760 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1e770 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1e780 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1e790 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1e7a0 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
1e7b0 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
1e7c0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1e7d0 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ++;.    put32bit
1e7e0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
1e7f0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1e800 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23  nge_counter);..#
1e810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1e820 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1e830 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
1e840 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
1e850 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1e860 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
1e870 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
1e880 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ata;.      rc = 
1e890 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1e8a0 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
1e8b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e8c0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
1e8d0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65  dif..    /* Rele
1e8e0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1e8f0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
1e900 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e910 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
1e920 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1e930 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
1e940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e950 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
1e960 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
1e970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e980 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
1e990 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e9a0 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  rc;.  if( MEMDB 
1e9b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1e9c0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1e9d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e9e0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1e9f0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1ea00 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
1ea10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ea20 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1ea30 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1ea40 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1ea50 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1ea60 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1ea70 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ea80 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1ea90 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1eaa0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1eab0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1eac0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1ead0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1eae0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1eaf0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1eb00 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1eb10 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1eb20 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1eb30 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1eb40 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1eb50 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1eb60 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1eb70 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1eb80 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1eb90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eba0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1ebb0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1ebc0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1ebd0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ebe0 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1ebf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ec00 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1ec10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1ec20 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1ec30 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1ec40 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1ec50 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1ec60 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1ec70 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1ec80 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1ec90 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1eca0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1ecb0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1ecc0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1ecd0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1ece0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1ecf0 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1ed00 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1ed10 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1ed20 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a   databases)..**.
1ed30 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
1ed40 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
1ed50 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
1ed60 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1ed70 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
1ed80 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
1ed90 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
1eda0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
1edb0 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
1edc0 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
1edd0 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
1ede0 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
1edf0 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
1ee00 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
1ee10 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
1ee20 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
1ee30 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ee40 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
1ee50 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63  er *pPager, .  c
1ee60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1ee70 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75  er, .  Pgno nTru
1ee80 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63  nc,.  int noSync
1ee90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1eea0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1eeb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1eec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1eed0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1eee0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
1eef0 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
1ef00 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c  n made, we can l
1ef10 65 61 76 65 20 74 68 65 20 74 72 61 6e 73 61 63  eave the transac
1ef20 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f  tion early..  */
1ef30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1ef40 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a  bModified==0 &&.
1ef50 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1ef60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1ef70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1ef80 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20  DELETE ||.      
1ef90 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
1efa0 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b  usiveMode!=0) ){
1efb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1efc0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
1efd0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 || pPager->jo
1efe0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1eff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f000 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
1f010 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
1f020 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
1f030 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
1f040 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
1f050 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f060 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
1f070 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
1f080 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1f090 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
1f0a0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
1f0b0 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
1f0c0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1f0d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f0e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1f0f0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1f100 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1f110 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
1f120 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
1f130 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
1f140 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1f150 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1f160 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1f170 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
1f180 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1f190 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1f1a0 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
1f1b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
1f1c0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
1f1d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f1e0 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
1f1f0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
1f200 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
1f210 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
1f220 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
1f230 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
1f240 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
1f250 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
1f260 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
1f270 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
1f280 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
1f290 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
1f2a0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
1f2b0 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
1f2c0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1f2d0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
1f2e0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
1f2f0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
1f300 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
1f310 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
1f320 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
1f330 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
1f340 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1f350 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
1f360 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20 20 20  AtomicWrite;.   
1f370 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63   pPg = sqlite3Pc
1f380 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f390 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f3a0 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57 72 69      useAtomicWri
1f3b0 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21  te = (.        !
1f3c0 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20  zMaster && .    
1f3d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f3e0 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20  nalOpen &&.     
1f3f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f400 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
1f410 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26 26  rSize(pPager) &&
1f420 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63   .        nTrunc
1f430 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 20  ==0 && .        
1f440 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
1f450 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29  pDirty==0).    )
1f460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1f470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f480 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
1f490 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1f4a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1f4b0 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74  );.    if( useAt
1f4c0 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20  omicWrite ){.   
1f4d0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1f4e0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
1f4f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1f500 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
1f510 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
1f520 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
1f530 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1f540 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f550 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
1f560 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1f570 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1f580 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
1f590 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1f5a0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1f5b0 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
1f5c0 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
1f5d0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
1f5e0 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
1f5f0 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
1f600 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1f610 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
1f620 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
1f630 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
1f640 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
1f650 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
1f660 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
1f670 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1f680 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
1f690 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
1f6a0 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
1f6b0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
1f6c0 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
1f6d0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
1f6e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
1f6f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f700 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1f710 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1f720 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29  unter(pPager, 1)
1f730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f740 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f750 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
1f760 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
1f770 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1f780 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74  ( !useAtomicWrit
1f790 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1f7a0 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20  OK ).#endif..   
1f7b0 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
1f7c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1f7d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1f7e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1f7f0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
1f800 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
1f810 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
1f820 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1f830 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
1f840 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
1f850 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
1f860 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1f870 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
1f880 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1f890 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
1f8a0 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
1f8b0 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
1f8c0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1f8d0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
1f8e0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
1f8f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1f900 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
1f910 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
1f920 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
1f930 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
1f940 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1f950 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
1f960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f970 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f980 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xit;.      if( p
1f990 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f9a0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1f9b0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66  LMODE_OFF ){.#if
1f9c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f9d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f9e0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1f9f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1fa00 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1fa10 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1fa20 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1fa30 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1fa40 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ges.          **
1fa50 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1fa60 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1fa70 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1fa80 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1fa90 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  l.          ** f
1faa0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
1fab0 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  /.          Pgno
1fac0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
1fad0 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1fae0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1faf0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
1fb00 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1fb10 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1fb20 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1fb30 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
1fb40 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1fb50 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1fb60 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
1fb70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1fb80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb90 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
1fba0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
1fbb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fbc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fbd0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fbe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fbf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fc00 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fc10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1fc20 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1fc30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1fc40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fc50 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fc60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fc70 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20       } .        
1fc80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
1fc90 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1fca0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1fcb0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1fcc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fcd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fce0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72  _exit;.        r
1fcf0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1fd00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1fd10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1fd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fd30 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
1fd40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fd60 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1fd70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fd80 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1fd90 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1fda0 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1fdb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fdc0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fdd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1fde0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1fdf0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1fe00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1fe10 2f 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  /.    pPg = sqli
1fe20 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1fe30 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1fe40 68 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  he);.    rc = pa
1fe50 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1fe60 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1fe70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fe80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fe90 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1fea0 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
1feb0 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d    /* The error m
1fec0 69 67 68 74 20 68 61 76 65 20 6c 65 66 74 20 74  ight have left t
1fed0 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c  he dirty list al
1fee0 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65  l fouled up here
1fef0 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74  ,.      ** but t
1ff00 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
1ff10 74 65 72 20 62 65 63 61 75 73 65 20 69 66 20 74  ter because if t
1ff20 68 65 20 69 66 20 74 68 65 20 64 69 72 74 79 20  he if the dirty 
1ff30 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a  list did.      *
1ff40 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c  * get corrupted,
1ff50 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   then the transa
1ff60 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20  ction will roll 
1ff70 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a  back and.      *
1ff80 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64 69  * discard the di
1ff90 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65  rty list.  There
1ffa0 20 69 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e   is an assert in
1ffb0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
1ffc0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1ffd0 67 65 73 28 29 20 74 68 61 74 20 76 65 72 69 66  ges() that verif
1ffe0 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65  ies that no atte
1fff0 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  mpt.      ** is 
20000 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69  made to use an i
20010 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73  nvalid dirty lis
20020 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
20030 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74    goto sync_exit
20040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20050 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
20060 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
20070 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  e);..    /* Sync
20080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20090 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
200a0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
200b0 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
200c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
200d0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
200e0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
200f0 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
20100 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
20110 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
20120 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
20130 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
20140 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
20150 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
20160 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
20170 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20180 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
20190 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
201a0 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
201b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
201c0 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
201d0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
201e0 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
201f0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
20200 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
20210 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c    * lock to spil
20220 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
20230 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
20240 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
20250 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73  .     * there is
20260 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
20270 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
20280 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
20290 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74   * better to ret
202a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
202b0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  .     */.    rc 
202c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
202d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
202e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
202f0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
20300 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
20310 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
20320 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
20330 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
20340 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
20350 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
20360 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
20370 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
20380 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20390 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
203a0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
203b0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
203c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
203d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
203e0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
203f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20400 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
20410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
20430 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20440 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
20450 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
20460 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
20470 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
20490 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
204a0 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50  0 &&.        (pP
204b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
204c0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
204d0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20  MODE_DELETE ||. 
204e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
204f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d  >exclusiveMode!=
20500 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
20510 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
20520 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
20530 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
20540 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
20550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20560 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
20570 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
20580 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20590 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
205a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6f   sqlite3PcacheCo
205b0 6d 6d 69 74 28 70 50 61 67 65 72 2d 3e 70 50 43  mmit(pPager->pPC
205c0 61 63 68 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  ache, 0);.    sq
205d0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
205e0 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
205f0 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  che);.    sqlite
20600 33 50 63 61 63 68 65 41 73 73 65 72 74 46 6c 61  3PcacheAssertFla
20610 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
20620 68 65 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f  he, 0, PGHDR_IN_
20630 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 70 50  JOURNAL);.    pP
20640 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
20650 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65  GER_SHARED;.  }e
20660 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
20670 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
20680 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
20690 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
206a0 63 68 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  che );.    rc = 
206b0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
206c0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
206d0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
206e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
206f0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
20700 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
20710 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
20720 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
20730 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
20740 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
20750 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
20760 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
20770 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
20780 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
20790 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
207a0 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
207b0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
207c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
207d0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
207e0 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
207f0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
20800 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
20810 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
20820 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
20830 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
20840 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
20850 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
20860 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
20870 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
20880 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
20890 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
208a0 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
208b0 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
208c0 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
208d0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
208e0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
208f0 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
20900 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
20910 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20930 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
20940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20960 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  OK;.  PAGERTRACE
20970 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
20980 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20990 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
209a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
209b0 63 61 63 68 65 52 6f 6c 6c 62 61 63 6b 28 70 50  cacheRollback(pP
209c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 31  ager->pPCache, 1
209d0 2c 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  , pPager->xReini
209e0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
209f0 33 50 63 61 63 68 65 52 6f 6c 6c 62 61 63 6b 28  3PcacheRollback(
20a00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
20a10 20 30 2c 20 70 50 61 67 65 72 2d 3e 78 52 65 69   0, pPager->xRei
20a20 6e 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  niter);.    sqli
20a30 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
20a40 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
20a50 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  e);.    sqlite3P
20a60 63 61 63 68 65 41 73 73 65 72 74 46 6c 61 67 73  cacheAssertFlags
20a70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20a80 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  , 0, PGHDR_IN_JO
20a90 55 52 4e 41 4c 29 3b 0a 20 20 20 20 70 50 61 67  URNAL);.    pPag
20aa0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
20ab0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
20ac0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
20ad0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
20ae0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
20af0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
20b00 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20b10 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
20b20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
20b30 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20b40 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
20b50 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
20b60 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
20b70 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20b80 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
20b90 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
20ba0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
20bb0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
20bc0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
20bd0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
20be0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
20bf0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
20c00 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
20c10 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
20c20 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
20c30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
20c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
20c50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
20c60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20c70 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
20c80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
20c90 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
20ca0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
20cb0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20cc0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
20cd0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
20ce0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
20cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
20d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
20d20 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20d30 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
20d40 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
20d50 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ..    pPager->db
20d60 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  Size = -1;..    
20d70 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
20d80 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
20d90 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
20da0 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
20db0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
20dc0 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
20dd0 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
20de0 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
20df0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
20e00 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
20e10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
20e20 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
20e30 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
20e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20e50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
20e60 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
20e70 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
20e80 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
20e90 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
20ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20eb0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
20ec0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
20ed0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
20ee0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
20ef0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
20f00 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
20f10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
20f30 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
20f40 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
20f50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
20f60 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20f70 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
20f80 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
20f90 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20fa0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
20fb0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
20fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
20fd0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
20fe0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
20ff0 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
21000 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
21010 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
21020 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
21030 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65  .  a[0] = sqlite
21040 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
21050 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21060 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74  ;.  a[1] = sqlit
21070 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
21080 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21090 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c  e);.  a[2] = sql
210a0 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61 63  ite3PcacheGetCac
210b0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
210c0 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20  PCache);.  a[3] 
210d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
210e0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
210f0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
21100 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
21110 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
21120 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
21130 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
21140 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
21150 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
21160 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
21170 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
21180 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
21190 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
211a0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69  .  return a;.}.i
211b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
211c0 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50  sMemdb(Pager *pP
211d0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
211e0 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a  MEMDB;.}.#endif.
211f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
21200 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
21210 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
21220 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
21230 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
21240 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
21250 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
21260 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
21270 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
21280 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
21290 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
212a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
212b0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
212c0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
212d0 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
212e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
212f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
21300 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
21310 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21320 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
21330 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21350 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21360 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
21370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
21380 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
21390 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
213a0 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
213b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
213c0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
213d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
213e0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
213f0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
21400 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21420 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
21430 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21440 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
21450 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
21460 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
21470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21480 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21490 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
214a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
214b0 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  ->pInStmt==0 );.
214c0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
214d0 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
214e0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
214f0 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70  dbSize);.  if( p
21500 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d  Pager->pInStmt==
21510 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
21520 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
21530 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
21540 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
21550 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
21560 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21570 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
21580 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
21590 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
215a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
215b0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
215c0 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
215d0 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
215e0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
215f0 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
21600 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
21610 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21620 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
21630 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
21640 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  tfd, SQLITE_OPEN
21650 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
21660 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21670 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
21680 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  n_failed;.    }.
21690 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
216a0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
216b0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
216c0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
216d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
216e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
216f0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
21700 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
21710 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
21720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
21730 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
21740 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
21750 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
21760 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
21770 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
21780 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
21790 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
217a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
217b0 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65  rc = pagerStmtBe
217c0 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  gin(pPager);.  r
217d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
217e0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
217f0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
21800 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
21810 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
21820 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
21830 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21840 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
21850 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
21860 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21870 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
21880 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
21890 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
218a0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
218b0 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  mt);.      pPage
218c0 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
218d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
218e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6f   sqlite3PcacheCo
218f0 6d 6d 69 74 28 70 50 61 67 65 72 2d 3e 70 50 43  mmit(pPager->pPC
21900 61 63 68 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ache, 1);.    }.
21910 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21920 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
21930 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21940 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
21950 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
21960 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
21970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21980 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
21990 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
219a0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
219b0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
219c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
219d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
219e0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
219f0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
21a00 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
21a10 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21a20 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
21a30 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
21a40 74 65 33 50 63 61 63 68 65 52 6f 6c 6c 62 61 63  te3PcacheRollbac
21a50 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
21a60 65 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 78 52  e, 1, pPager->xR
21a70 65 69 6e 69 74 65 72 29 3b 0a 20 20 20 20 20 20  einiter);.      
21a80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
21a90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
21aa0 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74  e;.      pager_t
21ab0 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
21ac0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
21ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21af0 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
21b00 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
21b10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21b20 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
21b30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
21b40 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
21b50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
21b60 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
21b70 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
21b80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
21b90 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
21ba0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
21bb0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
21bc0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21bd0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
21be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21bf0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21c00 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
21c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21c20 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
21c30 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
21c40 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
21c50 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
21c60 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
21c70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21c80 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
21c90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
21ca0 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
21cb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21cc0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
21cd0 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
21ce0 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
21cf0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
21d00 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
21d10 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
21d20 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
21d30 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
21d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21d50 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21d60 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
21d70 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
21d80 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
21d90 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
21da0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
21db0 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
21dc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21dd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
21de0 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
21df0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
21e00 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
21e10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
21e20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
21e30 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
21e40 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
21e50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21e60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
21e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21e80 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
21e90 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
21ea0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
21eb0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
21ec0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
21ed0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
21ee0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
21ef0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
21f00 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
21f10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21f20 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
21f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
21f40 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
21f50 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
21f60 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
21f70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21f80 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
21f90 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
21fa0 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
21fb0 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
21fc0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
21fd0 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
21fe0 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
21ff0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
22000 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
22010 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
22020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22030 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
22040 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
22050 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
22060 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
22070 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
22080 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
22090 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
220a0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
220b0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
220c0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
220d0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
220e0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
220f0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
22100 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
22110 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
22120 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
22130 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
22140 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
22150 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
22160 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
22170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22180 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
22190 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
221a0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
221b0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
221c0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
221d0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
221e0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
221f0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
22200 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
22210 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
22220 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
22230 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
22240 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
22250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
22260 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
22270 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22280 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
22290 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
222a0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
222b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
222c0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
222d0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
222e0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
222f0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
22300 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
22310 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
22320 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
22330 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
22340 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
22350 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
22360 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
22370 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
22380 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
22390 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
223a0 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
223b0 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
223c0 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
223d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
223e0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
223f0 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
22400 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
22410 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
22420 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
22430 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
22440 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
22450 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
22460 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
22470 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
22480 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
22490 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
224a0 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
224b0 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
224c0 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
224d0 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20  pPgOld;  /* The 
224e0 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
224f0 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
22500 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
22510 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
22520 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
22530 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
22540 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
22550 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
22560 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
22570 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
22580 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
22590 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
225a0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
225b0 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43   pgno);.  IOTRAC
225c0 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
225d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
225e0 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
225f0 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  .  pager_get_con
22600 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  tent(pPg);..  /*
22610 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
22620 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
22630 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
22640 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
22650 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
22660 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
22670 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
22680 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
22690 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
226a0 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
226b0 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
226c0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
226d0 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
226e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
226f0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
22700 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
22710 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
22720 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
22730 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
22740 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
22750 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
22760 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
22770 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
22780 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
22790 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
227a0 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
227b0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
227c0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
227d0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
227e0 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 7c 7c  R_IN_JOURNAL) ||
227f0 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
22800 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
22810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
22820 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
22830 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
22840 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
22850 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
22860 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
22870 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
22880 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
22890 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
228a0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
228b0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
228c0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
228d0 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
228e0 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
228f0 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
22900 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
22910 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
22920 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
22930 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
22940 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
22950 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 50 47 48  ->flags &= ~(PGH
22960 44 52 5f 4e 45 45 44 5f 53 59 4e 43 7c 50 47 48  DR_NEED_SYNC|PGH
22970 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  DR_IN_JOURNAL);.
22980 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
22990 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
229a0 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
229b0 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f   !pPgOld || pPgO
229c0 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20  ld->nRef==1 );. 
229d0 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
229e0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
229f0 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26   (pPgOld->flags&
22a00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
22a10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
22a20 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
22a30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
22a40 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 61  , pgno) ){.    a
22a50 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
22a60 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
22a70 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  |= PGHDR_IN_JOUR
22a80 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  NAL;.  }..  sqli
22a90 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
22aa0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  g, pgno);.  if( 
22ab0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71  pPgOld ){.    sq
22ac0 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
22ad0 70 50 67 4f 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pPgOld, 0);.    
22ae0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
22af0 65 61 73 65 28 70 50 67 4f 6c 64 29 3b 0a 20 20  ease(pPgOld);.  
22b00 7d 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  }..  makeDirty(p
22b10 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
22b20 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
22b30 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
22b40 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
22b50 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
22b60 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
22b70 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
22b80 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
22b90 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
22ba0 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
22bb0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
22bc0 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
22bd0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
22be0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
22bf0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
22c00 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
22c10 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
22c20 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
22c30 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
22c40 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
22c50 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
22c60 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
22c70 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
22c80 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
22c90 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
22ca0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22cb0 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
22cc0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
22cd0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
22ce0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
22cf0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
22d00 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
22d10 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
22d20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
22d30 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
22d40 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
22d50 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
22d60 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
22d70 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
22d80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
22d90 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
22da0 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
22db0 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
22dc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
22dd0 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
22de0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
22df0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
22e00 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
22e10 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
22e20 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
22e30 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
22e40 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
22e50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
22e60 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
22e70 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
22e80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
22e90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
22ea0 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
22eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
22ec0 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
22ed0 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
22ee0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
22ef0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
22f00 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
22f10 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
22f20 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
22f30 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
22f40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
22f50 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
22f60 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
22f70 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
22f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
22fa0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
22fb0 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53  al && (int)needS
22fc0 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
22fd0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
22fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
22ff0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
23000 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
23010 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
23020 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
23030 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
23040 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
23050 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
23060 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
23070 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
23080 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
23090 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
230a0 5f 53 59 4e 43 3b 0a 20 20 20 20 70 50 67 48 64  _SYNC;.    pPgHd
230b0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
230c0 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  R_IN_JOURNAL;.  
230d0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
230e0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
230f0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
23100 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
23110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
23120 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
23130 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23140 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
23150 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
23160 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
23170 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
23180 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
23190 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
231a0 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  >0 );.  return p
231b0 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
231c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
231d0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
231e0 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
231f0 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
23200 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
23210 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
23220 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
23230 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
23240 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
23250 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
23260 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
23270 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
23280 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45   (pPager?pPg->pE
23290 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  xtra:0);.}../*.*
232a0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
232b0 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
232c0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
232d0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
232e0 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
232f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
23300 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
23310 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
23320 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
23330 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
23340 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
23350 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
23360 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
23370 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
23380 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
23390 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
233a0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
233b0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
233c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
233d0 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
233e0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
233f0 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
23400 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
23410 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
23420 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
23430 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
23440 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
23450 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
23460 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
23470 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
23480 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
23490 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
234a0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
234b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
234c0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
234d0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
234e0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
234f0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
23500 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
23510 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
23520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
23530 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
23540 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
23550 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
23560 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
23570 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
23580 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
23590 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
235a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
235b0 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65   eMode;.  }.  re
235c0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
235d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
235e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
235f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
23600 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
23610 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
23620 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
23630 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
23640 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
23650 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ERY.**    PAGER_
23660 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
23670 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
23680 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
23690 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ATE.**    PAGER_
236a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
236b0 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  IST.**    PAGER_
236c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
236d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
236e0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
236f0 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a  UERY, then the j
23700 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73  ournal-mode is s
23710 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c  et to the.** val
23720 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
23730 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
23740 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
23750 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
23760 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72  updated).** jour
23770 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal-mode..*/.int
23780 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
23790 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
237a0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
237b0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
237c0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
237d0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  ALMODE_QUERY.   
237e0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
237f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23800 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
23810 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
23820 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23830 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
23840 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
23850 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23860 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
23870 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
23880 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23890 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73  MODE_OFF );.  as
238a0 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
238b0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
238c0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
238d0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
238e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65  >journalMode = e
238f0 4d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mode;.  }else{. 
23900 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65     assert( eMode
23910 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23920 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 7d  ODE_QUERY );.  }
23930 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
23940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
23950 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
23960 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
23970 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
23980 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
23990 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71  files..*/.i64 sq
239a0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
239b0 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72  lSizeLimit(Pager
239c0 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c   *pPager, i64 iL
239d0 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69  imit){.  if( iLi
239e0 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70  mit>=-1 ){.    p
239f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
23a00 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  zeLimit = iLimit
23a10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
23a20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
23a30 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64  zeLimit;.}..#end
23a40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23a50 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.