/ Hex Artifact Content
Login

Artifact 22f2896d2a539ca7285eab0fb667d1bdeea66ffa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 32  : pager.c,v 1.52
0350: 36 20 32 30 30 39 2f 30 31 2f 30 32 20 31 38 3a  6 2009/01/02 18:
0360: 31 30 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  10:42 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 6e 20 69 6e 73 74 61  ../*.** An insta
1720: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1730: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
1740: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
1750: 65 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73  each active.** s
1760: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61  avepoint and sta
1770: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1780: 6f 6e 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  on in the system
1790: 2e 20 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63  . All such struc
17a0: 74 75 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f  tures.** are sto
17b0: 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
17c0: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
17d0: 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c  ray, which is al
17e0: 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72  located and.** r
17f0: 65 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c  esized using sql
1800: 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3Realloc()..*
1810: 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65  *.** When a save
1820: 70 6f 69 6e 74 20 69 73 20 63 72 65 61 74 65 64  point is created
1830: 2c 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  , the PagerSavep
1840: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
1850: 66 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20  field is.** set 
1860: 74 6f 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e  to 0. If a journ
1870: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
1880: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61  tten into the ma
1890: 69 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  in journal while
18a0: 0a 2a 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e  .** the savepoin
18b0: 74 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 65  t is active, the
18c0: 6e 20 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  n iHdrOffset is 
18d0: 73 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  set to the byte 
18e0: 6f 66 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64  offset .** immed
18f0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1900: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
1910: 6c 20 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e  l record written
1920: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a   into the main.*
1930: 2a 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  * journal before
1940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
1950: 64 65 72 2e 20 54 68 69 73 20 69 73 20 72 65 71  der. This is req
1960: 75 69 72 65 64 20 64 75 72 69 6e 67 20 73 61 76  uired during sav
1970: 65 70 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61  epoint.** rollba
1980: 63 6b 20 28 73 65 65 20 70 61 67 65 72 50 6c 61  ck (see pagerPla
1990: 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29  ybackSavepoint()
19a0: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
19b0: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
19c0: 69 6e 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  int PagerSavepoi
19d0: 6e 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nt;.struct Pager
19e0: 53 61 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36  Savepoint {.  i6
19f0: 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20  4 iOffset;      
1a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1a10: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e  arting offset in
1a20: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
1a30: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 73 65  .  i64 iHdrOffse
1a40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a50: 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
1a60: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76    Bitvec *pInSav
1a70: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
1a80: 2a 20 53 65 74 20 6f 66 20 70 61 67 65 73 20 69  * Set of pages i
1a90: 6e 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74  n this savepoint
1aa0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67   */.  Pgno nOrig
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ac0: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e     /* Original n
1ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1ae0: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  n file */.  Pgno
1af0: 20 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   iSubRec;       
1b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1b10: 78 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72  x of first recor
1b20: 64 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d in sub-journal
1b30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1b40: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
1b50: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1b60: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1b80: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
1b90: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
1ba0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
1bb0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
1bc0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
1bd0: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
1be0: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
1bf0: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
1c00: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
1c10: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
1c20: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
1c30: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
1c40: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
1c50: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
1c60: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
1c70: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
1c80: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
1c90: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
1ca0: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
1cb0: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
1cc0: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
1cd0: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
1ce0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1cf0: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
1d00: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1d10: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
1d20: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
1d30: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
1d40: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
1d50: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4d  ssfully..**.** M
1d60: 61 6e 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65  anaging the size
1d70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d80: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69   file in pages i
1d90: 73 20 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c  s a little compl
1da0: 69 63 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 76  icated..** The v
1db0: 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62  ariable Pager.db
1dc0: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
1dd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1de0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1df0: 61 73 65 0a 2a 2a 20 69 6d 61 67 65 20 63 75 72  ase.** image cur
1e00: 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e  rently contains.
1e10: 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65   As the database
1e20: 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20   image grows or 
1e30: 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20  shrinks this.** 
1e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
1e50: 74 65 64 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ted. The variabl
1e60: 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
1e70: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
1e80: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 70 61 67  number.** of pag
1e90: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1ea0: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61  se file. This ma
1eb0: 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66  y be different f
1ec0: 72 6f 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65  rom Pager.dbSize
1ed0: 0a 2a 2a 20 69 66 20 73 6f 6d 65 20 70 61 67 65  .** if some page
1ee0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1ef0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1f00: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1f10: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1f20: 2a 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63  * out from the c
1f30: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
1f40: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
1f50: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
1f60: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 74 72 75   has been.** tru
1f70: 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e 63  ncated by an inc
1f80: 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20  remental-vacuum 
1f90: 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 50  operation. The P
1fa0: 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65 20  ager.dbOrigSize 
1fb0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 63 6f 6e 74  variable.** cont
1fc0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1fd0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1fe0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
1ff0: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2000: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
2010: 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63  as opened. The c
2020: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74  ontents of all t
2030: 68 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61  hree of these va
2040: 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 6f 6e  riables is.** on
2050: 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ly guaranteed to
2060: 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74   be correct if t
2070: 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72  he boolean Pager
2080: 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20  .dbSizeValid is 
2090: 74 72 75 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  true..*/.struct 
20a0: 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65  Pager {.  sqlite
20b0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
20c0: 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63        /* OS func
20d0: 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72  tions to use for
20e0: 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72   IO */.  u8 jour
20f0: 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  nalOpen;        
2100: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
2120: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
2130: 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  d */.  u8 journa
2140: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
2150: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
2160: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
2170: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
2180: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
2190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
21a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
21b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
21c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64  e */.  u8 noRead
21d0: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
21e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
21f0: 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65  her to obtain re
2200: 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20  adlocks */.  u8 
2210: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2230: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2240: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
2250: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2270: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
2280: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
2290: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
22a0: 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b    u8 sync_flags;
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c0: 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52   One of SYNC_NOR
22d0: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
22e0: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2310: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2320: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2330: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2350: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
2360: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
2370: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2390: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
23a0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
23b0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
23c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
23e0: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
23f0: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2400: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
2410: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
2420: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
2430: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
2440: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
2450: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
2460: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
2470: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
2480: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
2490: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
24c0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
24d0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
24e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
24f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2500: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2510: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2520: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e  */.  u8 doNotSyn
2530: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2540: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69   /* Boolean. Whi
2550: 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20  le true, do not 
2560: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
2570: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
2580: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
2590: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
25a0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
25b0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
25c0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
25d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25e0: 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52   On of the PAGER
25f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
2600: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64 62  alues */.  u8 db
2610: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
2620: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2630: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2640: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
2650: 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  b */.  u8 change
2660: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
2670: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
2680: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2690: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
26a0: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
26b0: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
26c0: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
26d0: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
26e0: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2710: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
2720: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
2730: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
2740: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
2750: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2760: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
2770: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
2780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2790: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
27a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 76   file */.  u32 v
27c0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
27e0: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
27f0: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  xOpen() */.  int
2800: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2820: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2830: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2840: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2860: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2870: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2880: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
2890: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
28a0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
28b0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
28c0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
28d0: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
28e0: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
28f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2900: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2910: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2920: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2940: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
2950: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
2960: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2970: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2990: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
29a0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
29b0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29d0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
29e0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
29f0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2a20: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2a30: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2a40: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a60: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
2a70: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2a80: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
2a90: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
2aa0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2ab0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2ac0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2ad0: 69 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ile */.  Bitvec 
2ae0: 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  *pAlwaysRollback
2af0: 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20  ;    /* One bit 
2b00: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 6d 61  for each page ma
2b10: 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f 6c 6c  rked always-roll
2b20: 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  back */.  char *
2b30: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2b40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b60: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2b70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2b80: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2bb0: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2bc0: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2bd0: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2be0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2bf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2c00: 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f  *fd, *jfd;     /
2c10: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2c20: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2c30: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2c40: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
2c50: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  jfd;         /* 
2c60: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2c70: 66 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  for the sub-jour
2c80: 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  nal*/.  int (*xB
2c90: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
2ca0: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
2cb0: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
2cc0: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
2cd0: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
2ce0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
2cf0: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
2d00: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34  Handler */.  i64
2d10: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
2d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2d30: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
2d40: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
2d50: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
2d60: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
2d70: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
2d80: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
2d90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
2da0: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
2db0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2dc0: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
2dd0: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
2de0: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
2df0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
2e00: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
2e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
2e20: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
2e30: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
2e40: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
2e50: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2e60: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
2e70: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
2e80: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
2e90: 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20  r)(DbPage*); /* 
2ea0: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2eb0: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2ec0: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
2ed0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
2ee0: 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  C.  void *(*xCod
2ef0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
2f00: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
2f10: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
2f20: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
2f30: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2f50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
2f60: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e   xCodec() */.#en
2f70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
2f80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
2f90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
2fa0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
2fb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
2fc0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
2fd0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
2fe0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
2ff0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
3000: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69  e changes */.  i
3010: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3020: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3030: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3040: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3050: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3060: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3070: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3080: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3090: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 50 61 67  object */..  Pag
30a0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61  erSavepoint *aSa
30b0: 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 6e  vepoint;.  int n
30c0: 53 61 76 65 70 6f 69 6e 74 3b 0a 7d 3b 0a 0a 2f  Savepoint;.};../
30d0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
30e0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
30f0: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
3100: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
3110: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
3120: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
3130: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
3140: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
3150: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
3160: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
3170: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
3180: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
3190: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
31a0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
31b0: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
31c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
31d0: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
31e0: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
31f0: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
3200: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
3210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3220: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
3230: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
3240: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
3250: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
3260: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
3270: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
3280: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
3290: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
32a0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
32b0: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
32c0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
32d0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
32e0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
32f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
3300: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
3310: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
3320: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
3330: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
3340: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
3350: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
3360: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
3370: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
3380: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
3390: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
33a0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
33b0: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
33c0: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
33d0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
33e0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
33f0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
3400: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
3410: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
3420: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
3430: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
3440: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
3450: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
3460: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
3470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
3480: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
3490: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
34a0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
34b0: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
34c0: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
34d0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
34e0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
34f0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
3500: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
3510: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
3520: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
3530: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3540: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
3550: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3560: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3570: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3580: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3590: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
35a0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
35b0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
35c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35d0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
35e0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
35f0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
3600: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
3610: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
3620: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
3630: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3640: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3650: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3660: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3670: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3680: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3690: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
36a0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
36b0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
36c0: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
36d0: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
36e0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
36f0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
3700: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
3710: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
3720: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
3730: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3740: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3750: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3760: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3770: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3780: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3790: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
37a0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
37b0: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
37c0: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
37d0: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
37e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
37f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3800: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3810: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3820: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3830: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3840: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3850: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3860: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3870: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3880: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3890: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
38a0: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
38b0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
38c0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
38d0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
38e0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
38f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3900: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3910: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3920: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3930: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3940: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3950: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3960: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3970: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3980: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3990: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
39a0: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
39b0: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
39c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
39d0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
39e0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
39f0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3a00: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3a10: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3a20: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3a30: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3a40: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3a50: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3a60: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3a70: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3a80: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3a90: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3aa0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3ab0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3ac0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3ad0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3ae0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3af0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3b00: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3b10: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3b20: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3b30: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3b40: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3b50: 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  .** Page number 
3b60: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73  PAGER_MJ_PGNO is
3b70: 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61   never used in a
3b80: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
3b90: 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65  e (it is.** rese
3ba0: 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67  rved for working
3bb0: 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77   around a window
3bc0: 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74  s/posix incompat
3bd0: 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a  ibility). It is.
3be0: 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a  ** used in the j
3bf0: 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66  ournal to signif
3c00: 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  y that the remai
3c10: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
3c20: 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20  nal file .** is 
3c30: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
3c40: 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
3c50: 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65  nal name - there
3c60: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67   are no more pag
3c70: 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61  es to.** roll ba
3c80: 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ck. See comments
3c90: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72   for function wr
3ca0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
3cb0: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
3cc0: 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41  */./* #define PA
3cd0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
3ce0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
3cf0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f  )->pageSize)) */
3d00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
3d10: 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 67 6e 6f  J_PGNO(x) ((Pgno
3d20: 29 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  )((PENDING_BYTE/
3d30: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
3d40: 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  +1))../*.** The 
3d50: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
3d60: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
3d70: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
3d80: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
3d90: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
3da0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
3db0: 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73   if it is necess
3dc0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67  ary to write pag
3dd0: 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20  e *pPg into the 
3de0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  sub-journal..** 
3df0: 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  A page needs to 
3e00: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
3e10: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
3e20: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
3e30: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f  one.** or more o
3e40: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66  pen savepoints f
3e50: 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20  or which:.**.** 
3e60: 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d    * The page-num
3e70: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
3e80: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67   or equal to Pag
3e90: 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69  erSavepoint.nOri
3ea0: 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  g, and.**   * Th
3eb0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
3ec0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ing to the page-
3ed0: 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65  number is not se
3ee0: 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65  t in.**     Page
3ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
3f00: 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  vepoint..*/.stat
3f10: 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69  ic int subjRequi
3f20: 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70  resPage(PgHdr *p
3f30: 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  Pg){.  Pgno pgno
3f40: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
3f50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
3f60: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
3f70: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
3f80: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
3f90: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
3fa0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
3fb0: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
3fc0: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
3fd0: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
3fe0: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
3ff0: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
4000: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
4010: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
4020: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4040: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
4050: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
4060: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
4070: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
4080: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
4090: 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  nJournal(PgHdr *
40a0: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
40b0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
40c0: 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49  (pPg->pPager->pI
40d0: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
40e0: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
40f0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
4100: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
4110: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4120: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
4130: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4140: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4150: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4160: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4170: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
4180: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
4190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
41a0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
41b0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
41c0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
41d0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
41e0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
41f0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
4200: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
4210: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4220: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4230: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4240: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4250: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
4260: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
4270: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4280: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
4290: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
42a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
42b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
42c0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
42d0: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
42e0: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
42f0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
4300: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
4310: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
4320: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
4330: 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72  *)A,B)../*.** Wr
4340: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4350: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
4360: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4370: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
4380: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
4390: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
43a0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
43b0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
43c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
43d0: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
43e0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
43f0: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
4400: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4410: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4420: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4430: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4440: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
4450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c  .}../*.** If fil
4460: 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63  e pFd is open, c
4470: 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  all sqlite3OsUnl
4480: 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  ock() on it..*/.
4490: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c  static int osUnl
44a0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
44b0: 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b   *pFd, int eLock
44c0: 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70  ){.  if( !pFd->p
44d0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
44e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
44f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
4500: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
4510: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
4520: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4530: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
4540: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
4550: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
4560: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
4570: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
4580: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
4590: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
45a0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
45b0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
45c0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
45d0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
45e0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
45f0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
4600: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
4610: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
4620: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
4630: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
4640: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
4650: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
4660: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
4670: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
4680: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
4690: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
46a0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
46b0: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
46c0: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
46d0: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
46e0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
46f0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
4700: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4710: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
4720: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
4730: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
4740: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
4750: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4760: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
4770: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
4780: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
4790: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b  ager){.  int dc;
47a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
47b0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
47c0: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tics */.  int nS
47d0: 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53  ector;      /* S
47e0: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
47f0: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
4800: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
4810: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
4820: 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  e *fd = pPager->
4830: 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70  fd;..  if( fd->p
4840: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64  Methods ){.    d
4850: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
4860: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
4870: 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  cs(fd);.    nSec
4880: 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  tor = sqlite3OsS
4890: 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20  ectorSize(fd);. 
48a0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
48b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
48c0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
48d0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
48e0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
48f0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
4900: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
4910: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
4920: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
4930: 73 20 7c 7c 20 0a 20 20 20 20 20 20 20 28 64 63  s || .       (dc
4940: 20 26 20 28 53 51 4c 49 54 45 5f 49 4f 43 41 50   & (SQLITE_IOCAP
4950: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
4960: 3e 38 29 29 20 26 26 20 6e 53 65 63 74 6f 72 3c  >8)) && nSector<
4970: 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  =szPage) ){.    
4980: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
4990: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
49a0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
49b0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
49c0: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
49d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
49e0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
49f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
4a00: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
4a10: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
4a20: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
4a30: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
4a40: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4a50: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
4a60: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
4a70: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
4a80: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
4a90: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
4aa0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
4ab0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
4ac0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
4ad0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4ae0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4af0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
4b00: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4b10: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
4b20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
4b30: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
4b40: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
4b50: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
4b60: 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69   Until the persi
4b70: 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c  sten error is cl
4b80: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
4b90: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
4ba0: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
4bb0: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
4bc0: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
4bd0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
4be0: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
4bf0: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
4c00: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
4c10: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
4c20: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
4c30: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
4c40: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
4c50: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
4c60: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
4c70: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
4c80: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
4c90: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
4ca0: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
4cb0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
4cc0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
4cd0: 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  cured, then the 
4ce0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
4cf0: 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
4d00: 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a  be replayed..*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
4d20: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
4d30: 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69 63 20  pPager);.static 
4d40: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
4d50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
4d60: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
4d70: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
4d80: 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
4d90: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
4da0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4db0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
4dc0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
4dd0: 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
4de0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
4df0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
4e00: 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20  RR.  );.  if(.  
4e10: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55    rc2==SQLITE_FU
4e20: 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  LL ||.    rc2==S
4e30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4e40: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43     rc2==SQLITE_C
4e50: 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20  ORRUPT.  ){.    
4e60: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
4e70: 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50  = rc;.    if( pP
4e80: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
4e90: 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  ER_UNLOCK .     
4ea0: 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
4eb0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
4ec0: 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
4ed0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
4ee0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
4ef0: 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ready unlocked, 
4f00: 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  call pager_unloc
4f10: 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20  k() now to.     
4f20: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72   ** clear the er
4f30: 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e  ror state and en
4f40: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
4f50: 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20  ger-cache is .  
4f60: 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c      ** completel
4f70: 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a  y empty..      *
4f80: 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  /.      pager_un
4f90: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
4fa0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4fb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
4fc0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4fd0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
4fe0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
4ff0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5000: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5010: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5020: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5030: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5040: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5050: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5060: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5070: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5080: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
5090: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
50a0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
50b0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
50c0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
50d0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
50e0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
50f0: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5100: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5110: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5120: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5130: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5140: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5150: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5160: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5170: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5180: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
5190: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
51a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
51b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
51c0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
51d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
51e0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
51f0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5200: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5210: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5220: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5230: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5240: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5250: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5260: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5270: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5280: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
5290: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
52a0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
52b0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
52c0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
52d0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
52e0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
52f0: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5300: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5310: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5320: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5330: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5340: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5350: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5360: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5370: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5380: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
5390: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
53a0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
53b0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
53c0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
53d0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
53e0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
53f0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5400: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5410: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5420: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5430: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5440: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5450: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5460: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5470: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5480: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5490: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
54a0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
54b0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
54c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
54d0: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
54e0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
54f0: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
5500: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
5510: 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  ry supplied by t
5520: 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a  he caller. .**.*
5530: 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70  * zMaster must p
5540: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5550: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61   of at least nMa
5560: 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63  ster bytes alloc
5570: 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63  ated by.** the c
5580: 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75  aller. This shou
5590: 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66  ld be sqlite3_vf
55a0: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28  s.mxPathname+1 (
55b0: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20  to ensure there 
55c0: 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61  is.** enough spa
55d0: 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ce to write the 
55e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
55f0: 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73  ame). If the mas
5600: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e  ter journal.** n
5610: 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ame in the journ
5620: 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61  al is longer tha
5630: 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  n nMaster bytes 
5640: 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20  (including a.** 
5650: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c  nul-terminator),
5660: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61   then this is ha
5670: 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d  ndled as if no m
5680: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5690: 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  me.** were prese
56a0: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
56b0: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  l..**.** If no m
56c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
56d0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
56e0: 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  nt zMaster[0] is
56f0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
5700: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
5710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
5720: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
5730: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
5740: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
5750: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
5760: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5770: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
5780: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
5790: 75 6d 3b 0a 20 20 75 33 32 20 75 3b 20 20 20 20  um;.  u32 u;    
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
57b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
57c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
57d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
57e0: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
57f0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
5800: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
5810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5820: 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  0';..  rc = sqli
5830: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
5840: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
5850: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5860: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
5870: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
5880: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5890: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a   szJ-16, &len);.
58a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
58b0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
58c0: 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61  ..  if( len>=nMa
58d0: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
58e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
58f0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
5900: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
5910: 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  12, &cksum);.  i
5920: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5930: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5950: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
5960: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20  c, 8, szJ-8);.  
5970: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5980: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
5990: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
59a0: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
59b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
59c0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
59d0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
59e0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
59f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5a00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
5a10: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
5a20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f  en] = '\0';..  /
5a30: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
5a40: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
5a50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5a60: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
5a70: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
5a80: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
5a90: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20  aster[u];.   }. 
5aa0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
5ab0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
5ac0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
5ad0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
5ae0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
5af0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
5b00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5b10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5b20: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
5b30: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
5b40: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
5b50: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
5b60: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
5b70: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
5b80: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
5b90: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ba0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
5bb0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  .    zMaster[0] 
5bc0: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5bd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5be0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5bf0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
5c00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
5c10: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5c20: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5c30: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5c40: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5c50: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5c60: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5c70: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5c80: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5c90: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5ca0: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5cb0: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5cc0: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5cd0: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5ce0: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d30: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5d50: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5d70: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5da0: 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72  ic void seekJour
5db0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5dc0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
5dd0: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
5de0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5df0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
5e00: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
5e10: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
5e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
5e30: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
5e40: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5e50: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5e60: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
5e70: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
5e80: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
5e90: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
5ea0: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
5eb0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5ec0: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
5ed0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
5ee0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
5ef0: 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65  e zeros over the
5f00: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
5f20: 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66  is has the.** ef
5f30: 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61  fect of invalida
5f40: 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
5f50: 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74   file and commit
5f60: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e  ting the.** tran
5f70: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
5f80: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
5f90: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5fa0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
5fb0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
5fc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74   SQLITE_OK;.  st
5fd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5fe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
5ff0: 7d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  };..  if( pPager
6000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
6010: 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d      i64 iLimit =
6020: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6030: 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20  SizeLimit;..    
6040: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
6050: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
6060: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
6070: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
6080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6090: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
60a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
60b0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
60c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
60d0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
60e0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
60f0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
6100: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
6110: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6120: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
6130: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
6140: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
6150: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
6160: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
6170: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
6180: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
6190: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
61a0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
61b0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
61c0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
61d0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
61e0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
61f0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
6200: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
6210: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
6220: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
6230: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
6240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6250: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
6260: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
6270: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
6280: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
6290: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
62a0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
62b0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
62c0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
62d0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
62e0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
62f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6300: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
6310: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
6320: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6330: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
6340: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
6350: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6360: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
6370: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
6380: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6390: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
63a0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
63b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
63c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
63d0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
63e0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
63f0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
6400: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
6410: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
6420: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
6430: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
6440: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
6450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
6460: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
6470: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
6480: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
6490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64a0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
64b0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
64c0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
64d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
64e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
64f0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
6500: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
6510: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
6520: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
6530: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
6540: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
6550: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
6560: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
6570: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
6580: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
6590: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
65a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
65b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
65c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
65d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
65e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
65f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
6600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
6610: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
6620: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
6630: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
6640: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
6650: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
6660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
6670: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
6680: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
6690: 3b 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  ;.  u32 nHeader 
66a0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
66b0: 7a 65 3b 0a 20 20 75 33 32 20 6e 57 72 69 74 65  ze;.  u32 nWrite
66c0: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69  ;.  int ii;..  i
66d0: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
66e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
66f0: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
6700: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
6710: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
6720: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
6730: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
6740: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
6750: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
6760: 20 73 69 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20   since the.  ** 
6770: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
6780: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
6790: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
67a0: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
67b0: 74 2e 69 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66  t.iHdrOff.  ** f
67c0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
67d0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
67e0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
67f0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
6800: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
6810: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
6820: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
6830: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
6840: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
6850: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
6860: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
6870: 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  }..  seekJournal
6880: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  Hdr(pPager);.  p
6890: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
68a0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
68b0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70  nalOff;..  memcp
68c0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
68d0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
68e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
68f0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
6900: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
6910: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
6920: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
6930: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
6940: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
6950: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
6960: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
6970: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
6980: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
6990: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
69a0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
69b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
69c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
69d0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
69e0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
69f0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
6a00: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
6a10: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
6a20: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
6a30: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
6a40: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
6a50: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
6a60: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
6a70: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
6a80: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
6a90: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
6aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
6ab0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
6ac0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
6ad0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
6ae0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6af0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
6b00: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
6b10: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
6b20: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
6b30: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
6b40: 75 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ure occured whil
6b50: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
6b60: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
6b70: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
6b80: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
6b90: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
6ba0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
6bb0: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
6bc0: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
6bd0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
6be0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
6bf0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
6c00: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
6c10: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
6c20: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
6c30: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
6c40: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
6c50: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
6c60: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
6c70: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
6c80: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
6c90: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
6ca0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
6cb0: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
6cc0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
6cd0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
6ce0: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
6cf0: 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
6d00: 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66  r->noSync);.  if
6d10: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
6d20: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
6d30: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
6d40: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
6d50: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
6d60: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
6d70: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
6d80: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
6d90: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
6da0: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
6db0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6dc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6dd0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
6de0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
6df0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6e00: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6e10: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
6e20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
6e30: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
6e40: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
6e50: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
6e60: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
6e70: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
6e80: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6e90: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
6ea0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6eb0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6ec0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
6ed0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
6ee0: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
6ef0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
6f00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6f10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6f20: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
6f30: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
6f40: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
6f50: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
6f60: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
6f70: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6f80: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6f90: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
6fa0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6fb0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
6fc0: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
6fd0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
6fe0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
6ff0: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
7000: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
7010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
7020: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
7030: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
7040: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
7050: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
7060: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
7070: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
7080: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
7090: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
70a0: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
70b0: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
70c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
70d0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 30 2c  alMagic)+16], 0,
70e0: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
70f0: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
7100: 61 6c 4d 61 67 69 63 29 2b 31 36 29 29 3b 0a 0a  alMagic)+16));..
7110: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7120: 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20  urnalHdr==0 ){. 
7130: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73     /* The page s
7140: 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74 33 32  ize */.    put32
7150: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7160: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7170: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
7180: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
7190: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
71a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
71b0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
71c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
71d0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
71e0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
71f0: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
7200: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
7210: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
7220: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
7230: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7240: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
7250: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
7260: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7270: 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ff);.    pPager-
7280: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
7290: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
72a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
72b0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
72c0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
72d0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
72e0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
72f0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
7300: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
7310: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
7320: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
7330: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
7340: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
7350: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
7360: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
7370: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
7380: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
7390: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
73a0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
73b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
73c0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
73d0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
73e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
73f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
7400: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
7410: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
7420: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
7430: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
7440: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
7450: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
7460: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
7470: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
7480: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7490: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
74a0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
74b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
74c0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
74d0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
74e0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
74f0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
7500: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
7510: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
7520: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
7530: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
7540: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
7550: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
7560: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
7570: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
7580: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
7590: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
75a0: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
75b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
75c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
75d0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
75e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
75f0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
7600: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
7610: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
7620: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
7630: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7640: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
7650: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
7660: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
7670: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b  /.  i64 jrnlOff;
7680: 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69 7a 65  .  int iPageSize
7690: 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  ;..  seekJournal
76a0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
76b0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
76c0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
76d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
76e0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
76f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7700: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c  DONE;.  }.  jrnl
7710: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
7720: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20  urnalOff;..  rc 
7730: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
7740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
7750: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
7760: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
7770: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7780: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
7790: 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  = sizeof(aMagic)
77a0: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
77b0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
77c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
77d0: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
77e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
77f0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
7800: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7810: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
7820: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
7830: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7840: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7850: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7860: 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67  jrnlOff+4, &pPag
7870: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7880: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7890: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
78a0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
78b0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c  >jfd, jrnlOff+8,
78c0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
78d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
78e0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
78f0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7900: 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28 75 33   jrnlOff+16, (u3
7910: 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65 29 3b  2 *)&iPageSize);
7920: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7930: 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50 61 67  E_OK .   && iPag
7940: 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20 20 26  eSize>=512 .   &
7950: 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53 51 4c  & iPageSize<=SQL
7960: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
7970: 45 20 0a 20 20 20 26 26 20 28 28 69 50 61 67 65  E .   && ((iPage
7980: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
7990: 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  e)==0 .  ){.    
79a0: 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 28  u16 pagesize = (
79b0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
79c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
79d0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
79e0: 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a  pPager, &pagesiz
79f0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
7a00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7a10: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
7a20: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
7a30: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
7a40: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
7a50: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
7a60: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
7a70: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
7a80: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7a90: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7aa0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7ab0: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7ac0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7ad0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
7ae0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
7af0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7b00: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
7b10: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
7b20: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
7b30: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
7b40: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
7b50: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
7b60: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7b70: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7b80: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 73 65 63  12, &pPager->sec
7b90: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
7ba0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7bb0: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
7bc0: 65 63 74 6f 72 53 69 7a 65 20 26 20 28 70 50 61  ectorSize & (pPa
7bd0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2d  ger->sectorSize-
7be0: 31 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  1))!=0.         
7bf0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  || pPager->secto
7c00: 72 53 69 7a 65 3e 30 78 31 30 30 30 30 30 30 20  rSize>0x1000000 
7c10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7c20: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
7c30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7c40: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
7c50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
7c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c70: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
7c80: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
7c90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7ca0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
7cb0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7cc0: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
7cd0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
7ce0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
7cf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7d00: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
7d10: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
7d20: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
7d30: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
7d40: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
7d50: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
7d60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
7d70: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
7d80: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
7d90: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
7da0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
7db0: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
7dc0: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
7dd0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
7de0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
7df0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
7e00: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
7e10: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
7e20: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
7e30: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
7e40: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
7e50: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
7e60: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
7e70: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
7e80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
7e90: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
7ea0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
7eb0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
7ec0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
7ed0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
7ee0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
7ef0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
7f00: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
7f10: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
7f20: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
7f30: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
7f40: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
7f50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
7f60: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
7f70: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
7f80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7f90: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
7fa0: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
7fb0: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
7fc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7fd0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7fe0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7ff0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
8000: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
8010: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
8020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8030: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
8040: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8050: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8060: 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e 20  MEMORY ) return 
8070: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
8080: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8090: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c   1;..  len = sql
80a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
80b0: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
80c0: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
80d0: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
80e0: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
80f0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
8100: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
8110: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
8120: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
8130: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
8140: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8150: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
8160: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
8170: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
8180: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
8190: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
81a0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
81b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
81c0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73  ullSync ){.    s
81d0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
81e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e  ager);.  }.  jrn
81f0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
8200: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
8210: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8220: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
8230: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
8240: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
8250: 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  nlOff, PAGER_MJ_
8260: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
8270: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8280: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8290: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a    jrnlOff += 4;.
82a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
82b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
82c0: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
82d0: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
82e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
82f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
8300: 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a  rnlOff += len;..
8310: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
8320: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
8330: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
8340: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
8350: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
8360: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8370: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8380: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8390: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
83a0: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
83b0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
83c0: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72  , jrnlOff);.  jr
83d0: 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f  nlOff += 8+sizeo
83e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
83f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8400: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
8410: 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66  noSync;..  /* If
8420: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
8430: 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
8440: 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
8450: 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
8460: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
8470: 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
8480: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
8490: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
84a0: 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
84b0: 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
84c0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
84d0: 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
84e0: 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
84f0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
8500: 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
8510: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
8520: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
8530: 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
8540: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
8550: 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
8560: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
8570: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
8580: 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
8590: 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
85a0: 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
85b0: 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
85c0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
85d0: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
85e0: 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
85f0: 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
8600: 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
8610: 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63 20  E_OK).   && (rc 
8620: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
8630: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
8640: 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51   &jrnlSize))==SQ
8650: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72  LITE_OK.   && jr
8660: 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20  nlSize>jrnlOff. 
8670: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8680: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
8690: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
86a0: 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
86b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
86c0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
86d0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
86e0: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
86f0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
8700: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8710: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
8720: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
8730: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
8740: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
8750: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
8760: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
8770: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
8780: 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
8790: 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
87a0: 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
87b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
87c0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
87d0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
87e0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
87f0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
8800: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
8810: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
8820: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
8830: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
8840: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
8850: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
8860: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
8870: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
8880: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
8890: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
88a0: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
88b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
88c0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
88d0: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
88e0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
88f0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
8900: 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
8910: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
8920: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
8930: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
8940: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
8950: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
8960: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
8970: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
8980: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
8990: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
89a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
89b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
89c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
89d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
89e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
89f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
8a00: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50 61 67  AllSavepoint(Pag
8a10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
8a20: 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d  nt ii;.  for(ii=
8a30: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
8a40: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
8a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
8a60: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
8a70: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
8a80: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
8a90: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
8aa0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
8ab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8ac0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
8ad0: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
8ae0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
8af0: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
8b00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8b10: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
8b20: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
8b30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
8b40: 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NRec = 0;.}../*.
8b50: 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
8b60: 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
8b70: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
8b80: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
8b90: 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c 6c 20  tvecs of.** all 
8ba0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
8bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
8bc0: 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
8bd0: 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
8be0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
8bf0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28    int ii;.  for(
8c00: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
8c10: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
8c20: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
8c30: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
8c40: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
8c50: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
8c60: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
8c70: 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 6d 61       /* TODO: ma
8c80: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 68  lloc() failure h
8c90: 61 6e 64 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 20  andling */.     
8ca0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
8cb0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
8cc0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t, pgno);.    }.
8cd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8ce0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8cf0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
8d00: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
8d10: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8d20: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
8d30: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
8d40: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
8d50: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
8d60: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
8d70: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
8d80: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
8d90: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
8da0: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
8db0: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
8dc0: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
8dd0: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
8de0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
8df0: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
8e00: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
8e10: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
8e20: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
8e30: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
8e40: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
8e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8e60: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8e70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
8e80: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8e90: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
8ea0: 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b  nt rc = osUnlock
8eb0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
8ec0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
8ed0: 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c ) pPager->errC
8ee0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
8ef0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
8f00: 64 20 3d 20 30 3b 0a 20 20 20 20 49 4f 54 52 41  d = 0;.    IOTRA
8f10: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
8f20: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
8f30: 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65   /* Always close
8f40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8f50: 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
8f60: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
8f70: 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  k..    ** Otherw
8f80: 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e  ise, another con
8f90: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
8fa0: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
8fb0: 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65   might.    ** de
8fc0: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75  lete the file ou
8fd0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
8fe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ff0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9000: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pen ){.      sql
9010: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
9020: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
9030: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9040: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  pen = 0;.      s
9050: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
9060: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
9070: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70  ournal);.      p
9080: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
9090: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
90a0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
90b0: 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
90c0: 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sRollback);.    
90d0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79    pPager->pAlway
90e0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
90f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9100: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
9110: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
9120: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
9130: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
9140: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
9150: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
9160: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
9170: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
9180: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
9190: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
91a0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
91b0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
91c0: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
91d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
91e0: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
91f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9200: 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72  _OK ) pPager->er
9210: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
9220: 4b 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  K;.      pager_r
9230: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
9240: 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61      releaseAllSa
9250: 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b  vepoint(pPager);
9260: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9270: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
9280: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9290: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
92a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
92b0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
92c0: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
92d0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
92e0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
92f0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9300: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
9310: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
9320: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
9330: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
9340: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
9350: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
9360: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
9370: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
9380: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
9390: 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e   state, .** do n
93a0: 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72  ot attempt the r
93b0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ollback..*/.stat
93c0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
93d0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
93e0: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
93f0: 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  p->errCode==SQLI
9400: 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74  TE_OK && p->stat
9410: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
9420: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
9430: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
9440: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
9450: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29  PagerRollback(p)
9460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
9470: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
9480: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
9490: 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ck(p);.}../*.** 
94a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
94b0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
94c0: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
94d0: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
94e0: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
94f0: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
9500: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
9510: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
9520: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
9530: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9540: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
9550: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
9560: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
9570: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
9580: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
9590: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
95a0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
95b0: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
95c0: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
95d0: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
95e0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
95f0: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
9600: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
9610: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
9620: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
9630: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
9640: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
9650: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
9660: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
9670: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
9680: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
9690: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
96a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
96b0: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
96c0: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
96d0: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
96e0: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
96f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
9700: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
9710: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
9720: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
9730: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
9740: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
9750: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
9760: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
9770: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
9780: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9790: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
97a0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
97b0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
97c0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
97d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
97e0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
97f0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
9800: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
9810: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
9820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9830: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
9840: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
9850: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
9860: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
9870: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
9880: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9890: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
98a0: 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
98b0: 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75   int isMemoryJou
98c0: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73  rnal = sqlite3Is
98d0: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
98e0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73  r->jfd);.      s
98f0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
9900: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
9910: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9920: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
9930: 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f   if( !isMemoryJo
9940: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
9950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
9960: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
9970: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
9980: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
9990: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
99a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
99b0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
99c0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
99d0: 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
99e0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
99f0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
9a00: 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   0))==SQLITE_OK 
9a10: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
9a20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
9a30: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9a40: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
9a50: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
9a60: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
9a70: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
9a80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9a90: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9aa0: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
9ab0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
9ac0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
9ad0: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
9ae0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
9af0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
9b00: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
9b10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
9b20: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9b30: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
9b40: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
9b50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9b60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9b70: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9b80: 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20  DE_DELETE || rc 
9b90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9ba0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
9bb0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
9bc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9bd0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
9be0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9bf0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
9c00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
9c10: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9c20: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
9c30: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
9c40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9c50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
9c60: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
9c70: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
9c80: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
9c90: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
9ca0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
9cb0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
9cc0: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b  AlwaysRollback);
9cd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
9ce0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
9cf0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9d00: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9d10: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
9d20: 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
9d30: 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
9d40: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
9d50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
9d60: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
9d70: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
9d80: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
9d90: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
9da0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
9db0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
9dc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9dd0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
9de0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
9df0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
9e00: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
9e10: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
9e20: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
9e30: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
9e40: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
9e50: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
9e60: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9e70: 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29  ==PAGER_SYNCED )
9e80: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
9e90: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
9ea0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61  USIVE;.  }.  pPa
9eb0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9ec0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
9ed0: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
9ee0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9ef0: 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69   = 0;.  /* lruLi
9f00: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
9f10: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 69  (pPager); */.  i
9f20: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
9f30: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
9f40: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
9f50: 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
9f60: 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  ed = 0;..  retur
9f70: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
9f80: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
9f90: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
9fa0: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
9fb0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
9fc0: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
9fd0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
9fe0: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
9ff0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
a000: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
a010: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
a020: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
a030: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
a040: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
a050: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
a060: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
a070: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
a080: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
a090: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
a0a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
a0b0: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
a0c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
a0d0: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
a0e0: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
a0f0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
a100: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
a110: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
a120: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
a130: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
a140: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
a150: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
a160: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
a170: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
a180: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
a190: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
a1a0: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
a1b0: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
a1c0: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
a1d0: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
a1e0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
a1f0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
a200: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
a210: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
a220: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
a230: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
a240: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
a250: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
a260: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
a270: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
a280: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
a290: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
a2a0: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
a2b0: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
a2c0: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
a2d0: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
a2e0: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
a2f0: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
a300: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
a310: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
a320: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
a330: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
a340: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
a350: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
a360: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
a370: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
a380: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
a390: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
a3a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
a3b0: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
a3c0: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
a3d0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
a3e0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
a3f0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
a400: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
a410: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
a420: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
a430: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
a440: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
a450: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
a460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
a470: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
a480: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
a490: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
a4a0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
a4b0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
a4c0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
a4d0: 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72  .** The isMainJr
a4e0: 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  nl flag is true 
a4f0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  if this is the m
a500: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
a510: 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73  rnal and.** fals
a520: 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  e for the statem
a530: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
a540: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
a550: 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20  journal uses.** 
a560: 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
a570: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a580: 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73  l does not..*/.s
a590: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a5a0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
a5b0: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
a5c0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
a5d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
a5e0: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
a5f0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
a600: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
a610: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
a620: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
a630: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
a640: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20    i64 offset,   
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
a670: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
a680: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
a690: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
a6a0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
a6b0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
a6c0: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
a6d0: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
a6e0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
a6f0: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
a700: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
a710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a720: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a740: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
a750: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
a760: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
a790: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
a7a0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
a7b0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7d0: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
a7e0: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
a7f0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
a800: 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
a810: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a  >pTmpSpace;   /*
a820: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
a830: 72 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  r a page */.  sq
a840: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 20  lite3_file *jfd 
a850: 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20  = (isMainJrnl ? 
a860: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
a870: 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 0a 20 20  ager->sjfd);..  
a880: 2f 2a 20 54 68 65 20 74 65 6d 70 20 73 74 6f 72  /* The temp stor
a890: 61 67 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  age must be allo
a8a0: 63 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  cated at this po
a8b0: 69 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  int */.  assert(
a8c0: 20 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65   aData );.  asse
a8d0: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
a8e0: 7c 20 70 44 6f 6e 65 20 29 3b 0a 20 20 61 73 73  | pDone );.  ass
a8f0: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
a900: 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 0a 0a 20  | pDone==0 );.. 
a910: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
a920: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
a930: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
a940: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
a950: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
a960: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
a970: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
a980: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
a990: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
a9a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
a9b0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
a9c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
a9d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
a9e0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
a9f0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
aa00: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
aa10: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
aa20: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
aa30: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
aa40: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
aa50: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
aa60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
aa70: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
aa80: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
aa90: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
aaa0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
aab0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
aac0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
aad0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
aae0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
aaf0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
ab00: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
ab10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
ab20: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
ab30: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
ab40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ab50: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
ab60: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
ab70: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
ab80: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
ab90: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
aba0: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
abb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
abc0: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
abd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
abe0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
abf0: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
ac00: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
ac10: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
ac20: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
ac30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ac40: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 21 69  += 4;.    if( !i
ac50: 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
ac60: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
ac70: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
ac80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ac90: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
aca0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 6f 6e 65  .  }.  if( pDone
acb0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
acc0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
acd0: 2c 20 70 67 6e 6f 29 29 20 29 7b 0a 20 20 20 20  , pgno)) ){.    
ace0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
acf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ad00: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
ad10: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
ad20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
ad30: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
ad40: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
ad50: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
ad60: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
ad70: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
ad80: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
ad90: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
ada0: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
adb0: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
adc0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
add0: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
ade0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
adf0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
ae00: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
ae10: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
ae20: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
ae30: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
ae40: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
ae50: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
ae60: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
ae70: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
ae80: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
ae90: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
aea0: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
aeb0: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
aec0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
aed0: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
aee0: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
aef0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
af00: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
af10: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
af20: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
af30: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
af40: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
af50: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
af60: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
af70: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
af80: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
af90: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
afa0: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
afb0: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
afc0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
afd0: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
afe0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
aff0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
b000: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
b010: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
b020: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
b030: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
b040: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
b050: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
b060: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
b070: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
b080: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
b090: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
b0a0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
b0b0: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
b0c0: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
b0d0: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
b0e0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
b0f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
b100: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
b110: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
b120: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
b130: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
b140: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
b150: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
b160: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
b170: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
b180: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
b190: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
b1a0: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
b1b0: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
b1c0: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
b1d0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
b1e0: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
b1f0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
b200: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
b210: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
b220: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
b230: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
b240: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
b250: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
b260: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
b270: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
b280: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
b290: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
b2a0: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
b2b0: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
b2c0: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
b2d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
b2e0: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
b2f0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
b300: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
b310: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
b320: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
b330: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
b340: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
b350: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
b360: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
b370: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
b380: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
b390: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
b3a0: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
b3b0: 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
b3c0: 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
b3d0: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
b3e0: 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
b3f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
b400: 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
b410: 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
b420: 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
b430: 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
b440: 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
b450: 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
b460: 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
b470: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
b480: 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
b490: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
b4a0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
b4b0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
b4c0: 45 52 54 52 41 43 45 35 28 22 50 4c 41 59 42 41  ERTRACE5("PLAYBA
b4d0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
b4e0: 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
b500: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
b510: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
b520: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
b530: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20  eSize, aData),. 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
b550: 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
b560: 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
b570: 75 72 6e 61 6c 22 29 0a 20 20 29 3b 0a 20 20 69  urnal").  );.  i
b580: 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
b590: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
b5a0: 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d  VE).   && (pPg==
b5b0: 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
b5c0: 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
b5d0: 59 4e 43 29 29 0a 20 20 20 26 26 20 28 70 50 61  YNC)).   && (pPa
b5e0: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
b5f0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  s).  ){.    i64 
b600: 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
b610: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
b620: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
b630: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
b640: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
b650: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b660: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
b670: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
b680: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
b690: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
b6a0: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
b6b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
b6c0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
b6d0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
b6e0: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
b6f0: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
b700: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
b710: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
b720: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
b730: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
b740: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
b750: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
b760: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
b770: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
b780: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
b790: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
b7a0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
b7b0: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
b7c0: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
b7d0: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
b7e0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
b7f0: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
b800: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
b810: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
b820: 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
b830: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
b840: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
b850: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
b860: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
b870: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
b880: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
b890: 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  er(pPg);.    }. 
b8a0: 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
b8b0: 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
b8c0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
b8d0: 6e 61 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e  nalOff<=pPager->
b8e0: 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
b8f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
b900: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
b910: 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
b920: 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
b930: 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
b940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
b950: 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
b960: 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
b970: 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
b980: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
b990: 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
b9a0: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
b9b0: 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
b9c0: 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
b9d0: 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
b9e0: 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
b9f0: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
ba00: 74 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20  t out to the..  
ba10: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ba20: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
ba30: 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
ba40: 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
ba50: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
ba60: 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
ba70: 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
ba80: 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
ba90: 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
baa0: 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
bab0: 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
bac0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
bad0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
bae0: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
baf0: 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
bb00: 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
bb10: 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
bb20: 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
bb30: 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
bb40: 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
bb50: 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
bb60: 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
bb70: 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
bb80: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
bb90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bba0: 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
bbb0: 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
bbc0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
bbd0: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
bbe0: 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
bbf0: 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
bc00: 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
bc10: 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
bc20: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
bc30: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
bc40: 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
bc50: 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
bc60: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
bc70: 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
bc80: 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
bc90: 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
bca0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
bcb0: 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
bcc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bcd0: 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
bce0: 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
bcf0: 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
bd00: 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
bd10: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
bd20: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
bd30: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
bd40: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
bd50: 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
bd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
bd70: 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
bd80: 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
bd90: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bda0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
bdb0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
bdc0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
bdd0: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
bde0: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
bdf0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
be00: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
be10: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
be20: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
be30: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
be40: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
be50: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
be60: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
be70: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
be80: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
be90: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
bea0: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
beb0: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
bec0: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
bed0: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
bee0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
bef0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
bf00: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  3);.    sqlite3P
bf10: 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
bf20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bf30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
bf40: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
bf50: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
bf60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
bf70: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
bf80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
bf90: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
bfa0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bfb0: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
bfc0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
bfd0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
bfe0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
bff0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c000: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c010: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
c020: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
c030: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
c040: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
c050: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
c060: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
c070: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
c080: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
c090: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
c0a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
c0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
c0c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
c0d0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
c0e0: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
c0f0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
c100: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
c110: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
c120: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
c130: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
c140: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
c150: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
c160: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
c170: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
c180: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
c190: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
c1a0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
c1b0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
c1c0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
c1d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
c1e0: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
c1f0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
c200: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
c210: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
c220: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
c230: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
c240: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
c250: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c260: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
c270: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
c280: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
c290: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
c2a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
c2b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c2c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
c2d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
c2e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
c2f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c300: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
c310: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c320: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
c330: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
c340: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
c350: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
c360: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
c370: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
c380: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
c390: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
c3a0: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
c3b0: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
c3c0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f  Malloc(pVfs->szO
c3d0: 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
c3e0: 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
c3f0: 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
c400: 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
c410: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
c420: 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
c430: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
c440: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
c450: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
c460: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c470: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
c480: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
c490: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c4a0: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
c4b0: 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
c4c0: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
c4d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c4e0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
c4f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
c500: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  er_open = 1;..  
c510: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
c520: 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
c530: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
c540: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
c550: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
c560: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
c570: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
c580: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
c590: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
c5a0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
c5b0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
c5c0: 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72  sterPtr = pPager
c5d0: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
c5e0: 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
c5f0: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
c600: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c610: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
c620: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
c630: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
c640: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
c650: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
c660: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
c670: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
c680: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
c690: 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
c6a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
c6b0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69  asterPtr);.    i
c6c0: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
c6d0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
c6e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c6f0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
c700: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
c710: 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
c720: 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
c730: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b  nMasterJournal];
c740: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c750: 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
c760: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
c770: 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
c780: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
c790: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c7a0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
c7b0: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
c7c0: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
c7d0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
c7e0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
c7f0: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
c800: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
c810: 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
c820: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c830: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
c840: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
c850: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
c860: 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  &exists);.      
c870: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c880: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
c890: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c8b0: 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
c8c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
c8d0: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
c8e0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
c8f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
c900: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
c910: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
c920: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
c930: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
c940: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
c950: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
c960: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
c970: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c980: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
c990: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
c9a0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
c9b0: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
c9c0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
c9d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
c9e0: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
c9f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
ca00: 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
ca10: 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
ca20: 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
ca30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca40: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
ca50: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
ca60: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
ca70: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
ca80: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
ca90: 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
caa0: 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
cab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
cac0: 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
cad0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cae0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
caf0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
cb00: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
cb10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
cb20: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
cb30: 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
cb40: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
cb50: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
cb60: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
cb70: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
cb80: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
cb90: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
cba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
cbc0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
cbd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cbe0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
cbf0: 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
cc00: 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
cc10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
cc20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
cc30: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
cc40: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
cc50: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
cc60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
cc70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
cc80: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
cc90: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
cca0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
ccb0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
ccc0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
ccd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
cce0: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
ccf0: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
cd00: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
cd10: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
cd20: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
cd30: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
cd40: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
cd50: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
cd60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
cd70: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
cd80: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
cd90: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
cda0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
cdb0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74  ile..**.** Might
cdc0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
cdd0: 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
cde0: 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
cdf0: 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a  ler than nPage..
ce00: 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ** This can happ
ce10: 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
ce20: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68   if we are in th
ce30: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72  e middle of a tr
ce40: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  ansaction.** whi
ce50: 63 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20  ch has extended 
ce60: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e  the file size an
ce70: 64 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  d the new pages 
ce80: 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65  are still all he
ce90: 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20  ld.** in cache, 
cea0: 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f  then an INSERT o
ceb0: 72 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20  r UPDATE does a 
cec0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
ced0: 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65  ck.  Some.** ope
cee0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
cef0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
cf00: 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
cf10: 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20  f you try to.** 
cf20: 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
cf30: 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
cf40: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
cf50: 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73   it currently is
cf60: 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74  ,.** so detect t
cf70: 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
cf80: 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
cf90: 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
cfa0: 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66   of the new.** f
cfb0: 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ile instead..*/.
cfc0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
cfd0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
cfe0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
cff0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
d000: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
d010: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d020: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
d030: 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
d040: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
d050: 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
d060: 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63   newSize;.    rc
d070: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d080: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
d090: 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
d0a0: 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
d0b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
d0c0: 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
d0d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d0e0: 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
d0f0: 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
d100: 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
d110: 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
d120: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d130: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
d140: 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
d150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d160: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d170: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d180: 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
d190: 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
d1a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
d1b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d1c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
d1d0: 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
d1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d1f0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
d200: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
d210: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
d220: 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
d230: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
d240: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
d250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d260: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
d270: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
d280: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
d290: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
d2a0: 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62  is at least as b
d2b0: 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72  ig as the sector
d2c0: 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a   size reported.*
d2d0: 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  * by sqlite3OsSe
d2e0: 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65  ctorSize().  The
d2f0: 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20   minimum sector 
d300: 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a  size is 512..*/.
d310: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
d320: 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
d330: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
d340: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
d350: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
d360: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
d370: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
d380: 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
d390: 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
d3a0: 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
d3b0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
d3c0: 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
d3d0: 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
d3e0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
d3f0: 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20  , in whcih case 
d400: 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
d410: 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
d420: 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
d430: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
d440: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
d450: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
d460: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
d470: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
d480: 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
d490: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
d4a0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
d4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
d4c0: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
d4d0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
d4e0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
d4f0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
d500: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
d510: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
d520: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
d530: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
d540: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
d550: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
d560: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
d570: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
d580: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
d590: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
d5a0: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
d5b0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
d5c0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
d5d0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
d5e0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
d5f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
d600: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
d610: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
d620: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
d630: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
d640: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
d650: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
d660: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
d670: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
d680: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
d690: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
d6a0: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
d6b0: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
d6c0: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
d6d0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
d6e0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
d6f0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
d700: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
d710: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
d720: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
d730: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
d740: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
d750: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
d760: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
d770: 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
d780: 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
d790: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
d7a0: 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
d7b0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
d7c0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d7d0: 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20   page case..**  
d7e0: 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (7)  4 byte inte
d7f0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d800: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d810: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
d820: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d830: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
d840: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
d850: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
d860: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
d870: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
d880: 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74  ).**  (8)  N byt
d890: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
d8a0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
d8b0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
d8c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
d8d0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
d8e0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
d8f0: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
d900: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
d910: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
d920: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
d930: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
d940: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
d950: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
d960: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
d970: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
d980: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
d990: 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f  8..**  (9)  Zero
d9a0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
d9b0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
d9c0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
d9d0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
d9e0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
d9f0: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
da00: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
da10: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
da20: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
da30: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
da40: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
da50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
da60: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
da70: 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65  st 8 items above
da80: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
da90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
daa0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
dab0: 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a   the 9th item..*
dac0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
dad0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
dae0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
daf0: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
db00: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
db10: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
db20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
db30: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
db40: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
db50: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
db60: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
db70: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
db80: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
db90: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
dba0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
dbb0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
dbc0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
dbd0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
dbe0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
dbf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
dc00: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
dc10: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
dc20: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
dc30: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
dc40: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
dc50: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
dc60: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
dc70: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
dc80: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
dc90: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
dca0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
dcb0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
dcc0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
dcd0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
dce0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
dcf0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
dd00: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
dd10: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
dd20: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
dd30: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
dd40: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
dd50: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
dd60: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
dd70: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
dd80: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
dd90: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
dda0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
ddb0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
ddc0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
ddd0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
dde0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
ddf0: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
de00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
de10: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
de20: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
de30: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
de40: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
de50: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
de60: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
de70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
de80: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
de90: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
dea0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
deb0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
dec0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
ded0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
dee0: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
def0: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
df00: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
df10: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
df20: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
df30: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
df40: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
df50: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
df60: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
df70: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
df80: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
df90: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
dfa0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
dfb0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
dfc0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
dfd0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
dfe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
dff0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e000: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
e010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e020: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
e030: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e040: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
e050: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
e060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e070: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
e080: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
e090: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0b0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
e0c0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
e0d0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
e100: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
e110: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
e120: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e130: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
e140: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
e150: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
e160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e170: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
e180: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
e190: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
e1a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
e1b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
e1c0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
e1d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
e1e0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
e1f0: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
e200: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
e210: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
e220: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
e230: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
e240: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
e250: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
e260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
e270: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
e280: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
e290: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
e2a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e2b0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e2c0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
e2d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e2e0: 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
e2f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
e300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
e310: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e320: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
e330: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
e340: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
e350: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
e360: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
e370: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
e380: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
e390: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
e3a0: 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
e3b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
e3c0: 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
e3d0: 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
e3e0: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
e3f0: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
e400: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
e410: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
e420: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
e430: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
e440: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
e450: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
e460: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e470: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
e480: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
e490: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
e4a0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
e4b0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
e4c0: 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
e4d0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
e4e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
e4f0: 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
e500: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
e510: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
e520: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
e530: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
e540: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
e550: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
e560: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
e570: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
e580: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
e590: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
e5a0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
e5b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
e5c0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
e5d0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
e5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
e5f0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
e600: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
e610: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
e620: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
e630: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
e640: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
e650: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
e660: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
e670: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
e680: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
e690: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
e6a0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
e6b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
e6c0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
e6d0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
e6e0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
e6f0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
e700: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
e720: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e730: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
e740: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e750: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
e760: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
e770: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
e780: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
e790: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
e7a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
e7b0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
e7c0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
e7d0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
e7e0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
e7f0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
e800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e810: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
e820: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
e830: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
e840: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
e850: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
e860: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
e870: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
e880: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
e890: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
e8a0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
e8b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e8c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
e8d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e8e0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
e8f0: 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
e900: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
e910: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
e920: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
e930: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e940: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
e950: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
e960: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
e970: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
e980: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
e990: 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
e9a0: 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
e9b0: 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
e9c0: 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
e9d0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
e9e0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
e9f0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ea00: 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
ea10: 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
ea20: 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
ea30: 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
ea40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
ea50: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
ea60: 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
ea70: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
ea80: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
ea90: 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
eaa0: 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
eab0: 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
eac0: 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20   #2565..    */. 
ead0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
eae0: 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
eaf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eb00: 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
eb10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
eb20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
eb30: 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
eb40: 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
eb50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
eb60: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
eb70: 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
eb80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
eb90: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
eba0: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
ebb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
ebc0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
ebd0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
ebe0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
ebf0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
ec00: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
ec10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
ec20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ec30: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
ec40: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
ec50: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
ec60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ec70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ec80: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
ec90: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
eca0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
ecb0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
ecc0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
ecd0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
ece0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
ecf0: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
ed00: 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b  for(u=0; u<nRec;
ed10: 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   u++){.      rc 
ed20: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
ed30: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
ed40: 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  , 1, pPager->jou
ed50: 72 6e 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a  rnalOff, 0, 0);.
ed60: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ed70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ed80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ed90: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
eda0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
edb0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
ede0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
edf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ee00: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
ee10: 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
ee20: 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  k, then the data
ee30: 62 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79  base is probably
ee40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f  .          ** go
ee50: 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65  ing to end up be
ee60: 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74  ing corrupt.  It
ee70: 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75   is corrupt to u
ee80: 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20  s, anyhow..     
ee90: 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20       ** Perhaps 
eea0: 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73  the next process
eeb0: 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63   to come along c
eec0: 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20  an fix it.....  
eed0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
eee0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ef00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
ef10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ef20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ef30: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
ef40: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
ef50: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
ef60: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
ef70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ef80: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
ef90: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
efa0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
efb0: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
efc0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
efd0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
efe0: 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d  Pathname+1);.  }
eff0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
f010: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
f020: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
f030: 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
f040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
f050: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
f060: 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
f070: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
f080: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
f090: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
f0a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
f0b0: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
f0c0: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
f0d0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
f0e0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f0f0: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
f100: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
f110: 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
f120: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
f130: 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
f140: 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
f150: 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
f160: 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
f170: 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
f180: 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
f190: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
f1a0: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
f1b0: 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
f1c0: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
f1d0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
f1e0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
f1f0: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
f200: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
f210: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
f220: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
f230: 62 61 63 6b 20 61 20 73 61 76 65 70 6f 69 6e 74  back a savepoint
f240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f250: 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
f260: 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
f270: 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
f280: 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
f290: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f2b0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
f2c0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
f2d0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f2e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
f2f0: 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
f300: 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
f310: 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 50 67 6e  records */.  Pgn
f320: 6f 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  o ii;           
f330: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f340: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
f350: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f360: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f370: 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
f380: 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
f390: 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
f3a0: 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
f3b0: 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
f3c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
f3d0: 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
f3e0: 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
f3f0: 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
f400: 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
f410: 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
f420: 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
f430: 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
f440: 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
f450: 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
f460: 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
f470: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f490: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
f4a0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 74  tabase back to t
f4b0: 68 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 62  he size it was b
f4c0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
f4d0: 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
f4e0: 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
f4f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ned..  */.  rc =
f500: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
f510: 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69  pPager, pSavepoi
f520: 6e 74 3f 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  nt?pSavepoint->n
f530: 4f 72 69 67 3a 70 50 61 67 65 72 2d 3e 64 62 4f  Orig:pPager->dbO
f540: 72 69 67 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  rigSize);.  asse
f550: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
f560: 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
f570: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c  );..  /* Now rol
f580: 6c 20 62 61 63 6b 20 61 6c 6c 20 6d 61 69 6e 20  l back all main 
f590: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 65 63  journal file rec
f5a0: 6f 72 64 73 20 74 68 61 74 20 6f 63 63 75 72 20  ords that occur 
f5b0: 61 66 74 65 72 20 62 79 74 65 0a 20 20 2a 2a 20  after byte.  ** 
f5c0: 62 79 74 65 20 6f 66 66 73 65 74 20 50 61 67 65  byte offset Page
f5d0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
f5e0: 65 74 20 74 68 61 74 20 68 61 76 65 20 61 20 70  et that have a p
f5f0: 61 67 65 20 6e 75 6d 62 65 72 20 6c 65 73 73 20  age number less 
f600: 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
f610: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
f620: 6f 69 6e 74 2e 6e 4f 72 69 67 2e 20 41 73 20 65  oint.nOrig. As e
f630: 61 63 68 20 72 65 63 6f 72 64 20 69 73 20 70 6c  ach record is pl
f640: 61 79 65 64 20 62 61 63 6b 2c 0a 20 20 2a 2a 20  ayed back,.  ** 
f650: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
f660: 67 20 62 69 74 20 69 6e 20 62 69 74 76 65 63 20  g bit in bitvec 
f670: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
f680: 49 6e 53 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  InSavepoint is .
f690: 20 20 2a 2a 20 63 6c 65 61 72 65 64 2e 0a 20 20    ** cleared..  
f6a0: 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
f6b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
f6c0: 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
f6d0: 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
f6e0: 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
f6f0: 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
f700: 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
f710: 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
f720: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
f730: 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
f740: 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
f750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f760: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
f770: 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
f780: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
f790: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
f7a0: 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70 50  ge(pPager, 1, pP
f7b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f7c0: 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
f7d0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
f7e0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
f7f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f800: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f810: 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77  Off = 0;.  }.  w
f820: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f830: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
f840: 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
f850: 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
f860: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
f870: 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
f880: 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
f890: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
f8a0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
f8b0: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
f8c0: 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
f8d0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f8e0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
f8f0: 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
f900: 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
f910: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
f920: 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
f930: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
f940: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
f950: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
f960: 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
f970: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
f980: 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
f990: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
f9a0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
f9b0: 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70  age(pPager, 1, p
f9c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f9d0: 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
f9e0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
f9f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
fa00: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
fa10: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
fa20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
fa30: 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a  nalOff==szJ );..
fa40: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62 61    /* Now roll ba
fa50: 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
fa60: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  e sub-journal. *
fa70: 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
fa80: 6e 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  nt ){.    for(ii
fa90: 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
faa0: 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
fab0: 5f 4f 4b 26 26 69 69 3c 28 75 33 32 29 70 50 61  _OK&&ii<(u32)pPa
fac0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 20 69  ger->stmtNRec; i
fad0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20  i++){.      i64 
fae0: 6f 66 66 73 65 74 20 3d 20 69 69 2a 28 34 2b 70  offset = ii*(4+p
faf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
fb00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
fb10: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
fb20: 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20  page(pPager, 0, 
fb30: 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65  offset, 1, pDone
fb40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fb50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
fb60: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
fb70: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
fb80: 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
fb90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fba0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
fbb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
fbc0: 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  J;.  }.  return 
fbd0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
fbe0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
fbf0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
fc00: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
fc10: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
fc20: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fc30: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
fc40: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
fc50: 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
fc60: 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
fc70: 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
fc80: 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
fc90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
fca0: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
fcb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
fcc0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
fcd0: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
fce0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
fcf0: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
fd00: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
fd10: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
fd20: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
fd30: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
fd40: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
fd50: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
fd60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
fd70: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
fd80: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
fd90: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
fda0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
fdb0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
fdc0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
fdd0: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
fde0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
fdf0: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
fe00: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
fe10: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
fe20: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
fe30: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
fe40: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
fe50: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
fe60: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
fe70: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
fe80: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
fe90: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
fea0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
feb0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
fec0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
fed0: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
fee0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
fef0: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
ff00: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
ff10: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
ff20: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
ff40: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
ff50: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
ff60: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
ff70: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
ff80: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
ff90: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
ffb0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
ffc0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
ffd0: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
ffe0: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
fff0: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
10000 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10010 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
10020 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
10030 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
10040 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
10050 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
10060 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
10070 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
10080 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
10090 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
100a0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
100c0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
100d0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
100e0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
100f0 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
10100 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
10110 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
10120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
10130 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
10140 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
10150 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
10160 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
10170 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
10180 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
10190 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
101a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
101b0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
101c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
101d0 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
101e0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
101f0 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
10200 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
10210 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
10220 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
10230 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
10240 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10250 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
10260 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
10270 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
10280 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
10290 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
102a0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
102b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
102c0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
102d0 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
102e0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
102f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10300 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
10310 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
10320 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
10330 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
10340 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
10350 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
10360 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
10370 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
10380 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
10390 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
103a0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
103b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
103c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
103d0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
103e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
103f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
10400 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
10410 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
10420 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
10430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
10440 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
10450 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
10460 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
10470 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
10480 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
10490 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  e the temporary.
104a0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ** file when it 
104b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
104c0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
104d0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
104e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
104f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10500 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
10510 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
10520 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
10530 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
10540 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
10550 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
10560 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
10570 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
10580 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
10590 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
105a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
105b0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
105c0 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
105d0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
105e0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
105f0 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
10600 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
10610 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
10620 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
10630 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
10640 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
10650 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
10660 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
10670 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
10680 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
10690 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
106a0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
106b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
106c0 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  TE_OK || pFile->
106d0 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65  pMethods );.  re
106e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
106f0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
10700 73 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20  ss(void *,PgHdr 
10710 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  *);../*.** Creat
10720 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
10730 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
10740 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10750 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
10760 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
10770 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
10780 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
10790 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
107a0 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
107b0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
107c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
107d0 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
107e0 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
107f0 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
10800 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
10810 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
10820 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
10830 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
10840 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
10850 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
10860 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
10870 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
10880 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
10890 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
108a0 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
108b0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
108c0 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
108d0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
108e0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
108f0 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
10900 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
10910 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
10920 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
10930 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
10940 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
10950 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
10960 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
10970 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
10980 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
10990 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
109a0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
109b0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
109c0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
109d0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
109e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
109f0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
10a00 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
10a10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
10a20 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
10a30 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
10a40 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
10a50 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
10a80 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
10a90 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
10aa0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
10ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
10ac0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
10ad0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
10ae0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
10af0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
10b00 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
10b10 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
10b20 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  en() */.){.  u8 
10b30 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
10b40 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  pPager = 0;.  in
10b50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10b60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10b70 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
10b80 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
10b90 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
10ba0 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
10bb0 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
10bc0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
10bd0 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
10be0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
10bf0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
10c00 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74  DLOCK)!=0;.  int
10c10 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
10c20 3b 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  ;.  int pcacheSi
10c30 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
10c40 68 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20  heSize();.  int 
10c50 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
10c60 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
10c70 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
10c80 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
10c90 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
10ca0 30 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0;..  if( sqlite
10cb0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
10cc0 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
10cd0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
10ce0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
10cf0 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
10d00 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
10d10 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
10d20 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
10d30 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
10d40 7a 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ze();.  }..  /* 
10d50 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
10d60 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
10d70 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
10d80 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
10d90 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
10da0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
10db0 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
10dc0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
10dd0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
10de0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
10df0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
10e00 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
10e10 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
10e20 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
10e30 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
10e40 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
10e50 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
10e60 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
10e70 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   ){.    nPathnam
10e80 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
10e90 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
10ea0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
10eb0 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a  alloc(nPathname*
10ec0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
10ed0 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
10ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ef0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66  NOMEM;.    }.#if
10f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10f10 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
10f20 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
10f30 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
10f40 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
10f50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
10f60 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
10f70 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
10f80 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
10f90 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
10fa0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
10fb0 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
10fc0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
10fd0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
10fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11000 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
11010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11020 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65   }.    nPathname
11030 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
11040 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
11050 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
11060 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
11070 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
11080 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73   */.  pPager = s
11090 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
110a0 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50  (.    sizeof(*pP
110b0 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20  ager) +         
110c0 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
110d0 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63  ture */.    pcac
110e0 68 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20  heSize      +   
110f0 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
11100 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
11110 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
11120 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  +           /* T
11130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11140 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20  structure */ .  
11150 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65    pVfs->szOsFile
11160 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
11170 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
11180 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
11190 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
111a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
111b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
111c0 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d   .    3*nPathnam
111d0 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20  e + 40          
111e0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
111f0 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
11200 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  rnal */.  );.  i
11210 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20  f( !pPager ){.  
11220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11230 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
11240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11250 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
11260 2d 3e 70 50 43 61 63 68 65 20 3d 20 28 50 43 61  ->pPCache = (PCa
11270 63 68 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  che *)&pPager[1]
11280 3b 0a 20 20 70 50 74 72 20 3d 20 28 28 75 38 20  ;.  pPtr = ((u8 
11290 2a 29 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20  *)&pPager[1]) + 
112a0 70 63 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50  pcacheSize;.  pP
112b0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
112c0 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61   vfsFlags;.  pPa
112d0 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74  ger->fd = (sqlit
112e0 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
112f0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d  Vfs->szOsFile*0]
11300 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
11310 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
11320 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
11330 4f 73 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65  OsFile];.  pPage
11340 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
11350 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
11360 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75  fs->szOsFile+jou
11370 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20  rnalFileSize];. 
11380 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
11390 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74  me = (char*)&pPt
113a0 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
113b0 2b 32 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  +2*journalFileSi
113c0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
113d0 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
113e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
113f0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
11400 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
11410 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
11420 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b  ctory[nPathname+
11430 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56  1];.  pPager->pV
11440 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28  fs = pVfs;.  if(
11450 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
11460 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
11470 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
11480 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
11490 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
114a0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
114b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
114c0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
114d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
114e0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
114f0 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
11500 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68  ){.    if( nPath
11510 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61  name>(pVfs->mxPa
11520 74 68 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73 69  thname - (int)si
11530 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29  zeof("-journal")
11540 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
11550 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
11560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11570 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
11580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11590 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
115a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
115b0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20  , pPager->fd,.  
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76         pPager->v
115e0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
115f0 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  .      readOnly 
11600 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
11610 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
11620 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11630 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
11640 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
11650 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
11660 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f  ss,.      ** cho
11670 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
11680 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
11690 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
116a0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  e the.      ** d
116b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
116c0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
116d0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
116e0 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a  um of:.      **.
116f0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51        **    + SQ
11700 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
11710 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a  E_SIZE,.      **
11720 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
11730 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
11740 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
11750 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  ).      **    + 
11760 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
11770 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
11780 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
11790 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ally..      */. 
117a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
117b0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
117c0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nly ){.        i
117d0 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d  nt iSectorSize =
117e0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
117f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
11800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
11810 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f 72  PageDflt<iSector
11820 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
11830 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
11840 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  SectorSize;.    
11850 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
11860 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
11870 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
11880 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
11890 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
118a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
118b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
118c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
118d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
118e0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
118f0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
11900 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
11910 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
11920 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
11930 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
11940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
11950 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
11960 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
11970 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
11980 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
11990 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
119a0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
119b0 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
119c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
119d0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
119e0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
119f0 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69  ) szPageDflt = i
11a00 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
11a10 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
11a20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
11a30 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41  geDflt>SQLITE_MA
11a40 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
11a50 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
11a60 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
11a70 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
11a80 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
11a90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11aa0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
11ab0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
11ac0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
11ad0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
11ae0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
11af0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
11b00 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
11b10 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
11b20 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
11b30 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
11b40 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
11b50 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
11b60 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
11b70 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
11b80 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
11b90 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
11ba0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
11bb0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
11bc0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
11bd0 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
11be0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
11bf0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
11c00 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
11c10 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
11c20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
11c30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
11c40 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
11c50 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
11c60 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
11c70 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
11c80 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
11c90 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11ca0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
11cb0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
11cc0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73  ite3PageMalloc(s
11cd0 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a  zPageDflt);.  }.
11ce0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
11cf0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
11d00 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
11d10 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72  s above..  ** Fr
11d20 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
11d30 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
11d40 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20   the file..  ** 
11d50 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
11d60 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  is not allocated
11d70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
11d80 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61  d to set .  ** a
11d90 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  ny Pager.errMask
11da0 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f   variables..  */
11db0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c  .  if( !pPager |
11dc0 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
11dd0 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  pace ){.    sqli
11de0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
11df0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
11e00 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
11e10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
11e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
11e30 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
11e40 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46    }.  nExtra = F
11e50 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
11e60 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
11e70 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
11e80 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
11e90 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
11eb0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
11ec0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
11ed0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
11ee0 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
11ef0 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
11f00 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
11f10 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
11f20 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
11f30 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
11f40 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
11f50 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
11f60 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69  ename))..  /* Fi
11f70 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72  ll in Pager.zDir
11f80 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65  ectory[] */.  me
11f90 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  mcpy(pPager->zDi
11fa0 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d  rectory, pPager-
11fb0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
11fc0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  hname+1);.  for(
11fd0 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  i=sqlite3Strlen3
11fe0 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  0(pPager->zDirec
11ff0 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69 3e  tory); .      i>
12000 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
12010 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
12020 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
12030 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
12040 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
12050 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  0;..  /* Fill in
12060 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b   Pager.zJournal[
12070 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  ] */.  if( zPath
12080 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63  name ){.    memc
12090 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
120a0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
120b0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
120c0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
120d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
120e0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
120f0 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d  ournal", 9);.  }
12100 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
12110 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  ->zJournal = 0;.
12120 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72    }..  /* pPager
12130 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
12140 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
12150 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
12160 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
12170 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
12180 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
12190 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
121a0 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
121b0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
121c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
121d0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
121e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
121f0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
12200 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
12210 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
12220 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12230 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20  = szPageDflt;.  
12240 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
12250 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
12260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
12270 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
12280 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
12290 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
122a0 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
122b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
122c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
122d0 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
122e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
122f0 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
12300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12310 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
12320 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
12330 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
12340 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
12350 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
12360 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
12370 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
12380 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
12390 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
123a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
123b0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
123c0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
123d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
123e0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
123f0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
12400 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
12410 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
12420 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12430 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
12440 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
12450 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
12460 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
12470 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
12480 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
12490 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
124a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
124b0 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = (pPager->tempF
124c0 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
124d0 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  al) ?1:0;.  pPag
124e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
124f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
12500 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
12510 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
12520 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
12530 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
12540 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
12550 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12560 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
12570 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
12580 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
12590 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
125a0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
125b0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
125c0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
125d0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
125e0 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
125f0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
12600 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  ||tempFile);.  s
12610 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
12620 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
12630 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
12640 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
12650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12660 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
12670 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
12680 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
12690 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
126a0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
126b0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
126c0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
126d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
126e0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
126f0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
12700 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12710 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
12720 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
12730 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
12740 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
12750 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
12760 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
12770 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  r, .  int (*xBus
12780 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
12790 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  ),.  void *pBusy
127a0 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20 0a  HandlerArg.){  .
127b0 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
127c0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
127d0 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
127e0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
127f0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
12800 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rg;.}../*.** Set
12810 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
12820 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
12830 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
12840 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
12850 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
12860 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
12870 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
12880 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
12890 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
128a0 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
128b0 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
128c0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
128d0 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
128e0 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
128f0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
12900 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
12910 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
12920 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
12930 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
12940 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12950 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
12980 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50  (DbPage*)){.  pP
12990 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
129a0 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
129b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
129c0 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53   size to *pPageS
129d0 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67  ize. If the sugg
129e0 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a  est new page siz
129f0 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70  e is.** inapprop
12a00 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
12a10 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
12a20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
12a30 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66  hat.** value bef
12a40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
12a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12a60 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
12a70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
12a80 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
12a90 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
12aa0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
12ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12ac0 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
12ad0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
12ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
12af0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
12b00 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
12b10 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
12b20 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
12b30 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
12b40 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
12b50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
12b60 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
12b70 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
12b80 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
12b90 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
12ba0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
12bb0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
12bc0 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
12bd0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
12be0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
12bf0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
12c00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
12c10 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
12c20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12c30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12c40 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
12c50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12c60 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
12c70 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
12c80 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
12c90 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74 53  er->memDb ) setS
12ca0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
12cb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12cc0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
12cd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
12ce0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
12cf0 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
12d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12d10 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
12d20 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
12d30 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
12d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12d50 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
12d60 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
12d70 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
12d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12d90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
12da0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
12db0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
12dc0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
12dd0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
12de0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
12df0 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
12e00 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
12e10 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
12e20 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
12e30 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
12e40 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
12e50 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
12e60 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
12e70 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
12e80 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
12e90 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
12ea0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
12eb0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
12ec0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
12ed0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
12ee0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
12ef0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
12f00 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
12f10 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
12f20 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
12f30 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
12f40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
12f50 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
12f60 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
12f70 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
12f80 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
12f90 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
12fa0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
12fb0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
12fc0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
12fd0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
12fe0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
12ff0 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
13000 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
13010 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
13020 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
13030 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
13040 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
13050 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
13060 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
13070 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
13080 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
13090 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
130a0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
130b0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
130c0 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
130d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
130e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65  pPager, 0);.  re
130f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
13100 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
13110 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
13120 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
13130 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
13140 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
13150 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
13160 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
13170 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
13180 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
13190 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
131a0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
131b0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
131c0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
131d0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
131e0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
131f0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
13200 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
13210 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
13220 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
13230 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
13240 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
13250 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
13260 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
13270 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
13280 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
13290 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
132a0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
132b0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
132c0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
132d0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
132e0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
132f0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
13300 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
13310 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
13320 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
13330 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
13340 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
13350 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
13360 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
13370 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
13380 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
13390 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
133a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
133b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
133c0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
133d0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
133e0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
133f0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
13400 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
13410 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
13420 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
13430 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
13440 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
13450 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
13460 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
13470 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
13480 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
13490 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
134a0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
134b0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
134c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
134d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
134e0 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
134f0 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
13500 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
13510 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
13520 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
13530 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
13540 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
13550 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
13560 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
13570 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
13580 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
13590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
135a0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
135b0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
135c0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
135d0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
135e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
135f0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
13600 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
13610 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
13620 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
13630 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
13640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
13650 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
13660 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
13670 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
13680 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
13690 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
136a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
136b0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
136c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
136d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
136e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
136f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
13700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13710 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13720 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
13730 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
13740 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
13750 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
13760 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
13770 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
13780 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
13790 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
137a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
137b0 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
137c0 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
137d0 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
137e0 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
137f0 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
13800 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
13810 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
13820 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
13830 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
13840 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
13850 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
13860 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
13870 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
13880 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13890 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
138a0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
138b0 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
138c0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
138d0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
138e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
138f0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
13900 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
13910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13920 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
13930 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
13940 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
13950 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
13960 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
13970 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
13980 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
13990 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
139a0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
139b0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
139c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
139d0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
139e0 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
139f0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
13a00 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
13a10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13a20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13a30 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
13a40 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
13a50 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
13a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
13a70 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
13a80 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
13a90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
13aa0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
13ab0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13ac0 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b  bSize = (Pgno)n;
13ad0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13ae0 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67 6e  bFileSize = (Pgn
13af0 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65  o)n;.      pPage
13b00 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
13b10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
13b20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
13b30 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
13b40 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
13b50 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
13b60 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
13b70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
13b80 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20  gno = (Pgno)n;. 
13b90 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20   }.  if( pnPage 
13ba0 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
13bb0 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20 72   (int)n;.  }.  r
13bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
13be0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
13bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
13c00 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
13c10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13c20 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
13c30 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
13c40 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
13c50 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
13c60 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
13c70 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
13c80 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
13c90 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
13ca0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
13cb0 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
13cc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
13cd0 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
13ce0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
13cf0 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
13d00 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
13d10 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
13d20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13d30 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
13d40 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
13d50 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
13d60 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
13d70 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
13d80 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
13d90 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
13da0 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
13db0 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
13dc0 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
13dd0 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
13de0 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
13df0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
13e00 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
13e10 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
13e20 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
13e30 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
13e40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13e50 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
13e60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
13e70 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
13e80 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
13e90 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
13ea0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
13eb0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
13ec0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
13ed0 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
13ee0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
13ef0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
13f00 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
13f10 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
13f20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
13f30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
13f40 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
13f50 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
13f60 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
13f70 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
13f80 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
13f90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
13fa0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
13fb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
13fc0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
13fd0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
13fe0 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
13ff0 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
14000 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
14010 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
14020 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
14030 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
14040 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
14050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
14060 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
14070 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
14080 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
14090 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
140a0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
140b0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
140c0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
140d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
140e0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
140f0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
14100 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20  eValid==0 );..  
14110 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
14120 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
14130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14140 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
14150 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
14160 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
14170 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
14180 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
14190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
141a0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
141b0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
141c0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
141d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
141e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
14200 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
14210 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
14220 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
14230 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
14240 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
14250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14260 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
14270 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
14280 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
14290 63 69 66 69 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 55  cified. .**.** U
142a0 6e 6c 65 73 73 20 61 6e 20 49 4f 20 65 72 72 6f  nless an IO erro
142b0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66  r occurs, this f
142c0 75 6e 63 74 69 6f 6e 20 69 73 20 67 75 61 72 61  unction is guara
142d0 6e 74 65 65 64 20 74 6f 20 6d 6f 64 69 66 79 20  nteed to modify 
142e0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
142f0 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 49 66   file itself. If
14300 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
14310 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 20 77  ck is not held w
14320 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14330 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  n.** is called, 
14340 6f 6e 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  one is obtained 
14350 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e  before truncatin
14360 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69  g the file..*/.i
14370 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
14380 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
14390 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
143a0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
143b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
143c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
143d0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
143e0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
143f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
14400 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  er, 0);.  if( pP
14410 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
14420 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
14430 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
14440 73 65 20 69 66 28 20 6e 50 61 67 65 3c 70 50 61  se if( nPage<pPa
14450 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
14460 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63  ){.    rc = sync
14470 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
14480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
144a0 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
144b0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
144c0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
144d0 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
144e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
144f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14500 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14510 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OCK);.    }.    
14520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14530 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14540 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
14550 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
14560 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
14570 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
14580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14590 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
145a0 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
145b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
145c0 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
145d0 67 65 20 70 61 67 65 73 2e 20 55 6e 6c 69 6b 65  ge pages. Unlike
145e0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
145f0 54 72 75 6e 63 61 74 65 28 29 2c 20 74 68 69 73  Truncate(), this
14600 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
14610 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
14620 66 79 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  fy the.** databa
14630 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
14640 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
14650 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
14660 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a   of the pager.**
14670 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
14680 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  the truncation w
14690 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
146a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a   the current .**
146b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
146c0 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  committed..*/.vo
146d0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
146e0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
146f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
14700 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
14710 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
14720 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65  eValid );.  asse
14730 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
14740 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70  ze>=nPage );.  p
14750 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14760 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
14770 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
14780 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
14790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
147a0 67 65 20 69 6e 20 70 61 67 65 73 2e 20 54 68 69  ge in pages. Thi
147b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 69  s.** function di
147c0 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74  ffers from sqlit
147d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
147e0 28 29 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  () in two ways:.
147f0 2a 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d 61 79  **.**  a) It may
14800 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
14810 77 68 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  when at least on
14820 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  e reference to a
14830 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
14840 20 70 61 67 65 20 69 73 20 68 65 6c 64 2e 20 54   page is held. T
14850 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
14860 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
14870 20 73 69 7a 65 20 69 73 20 61 6c 72 65 61 64 79   size is already
14880 0a 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20 61 6e  .**     known an
14890 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  d a call to sqli
148a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  te3OsFileSize() 
148b0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
148c0 0a 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65 20 72  .**.**  b) The r
148d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e  eturn value is n
148e0 6f 74 20 61 64 6a 75 73 74 65 64 20 66 6f 72 20  ot adjusted for 
148f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
14900 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
14910 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65 28  3PagerImageSize(
14920 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14940 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
14950 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
14960 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ->dbSize;.}.#end
14970 69 66 20 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  if  /* ifndef SQ
14980 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14990 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  CUUM */../*.** S
149a0 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
149b0 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
149c0 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
149d0 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
149e0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
149f0 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
14a00 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
14a10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14a20 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
14a30 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
14a40 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
14a50 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
14a60 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
14a70 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
14a80 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
14a90 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
14aa0 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
14ab0 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
14ac0 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
14ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
14ae0 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
14af0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
14b00 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
14b10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
14b20 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
14b30 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14b40 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
14b50 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
14b60 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
14b70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14b80 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
14b90 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
14ba0 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
14bb0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14bc0 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
14bd0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
14be0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
14bf0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
14c00 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
14c10 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64  r *pPager){..  d
14c20 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
14c30 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
14c40 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14c50 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50  gnMalloc();.  pP
14c60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
14c70 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
14c80 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
14c90 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
14ca0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
14cb0 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
14cc0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
14cd0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
14ce0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
14cf0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
14d00 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
14d10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47  nMalloc();.  PAG
14d20 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  ERTRACE2("CLOSE 
14d30 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
14d40 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
14d50 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
14d60 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28  , pPager)).  if(
14d70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14d80 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
14d90 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14da0 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
14db0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
14dc0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
14dd0 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74  ournal);.  sqlit
14de0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
14df0 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
14e00 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 72 65 6c 65  ollback);.  rele
14e10 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28  aseAllSavepoint(
14e20 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
14e30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14e40 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
14e50 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
14e60 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
14e70 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
14e80 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
14e90 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
14ea0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14eb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14ec0 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
14ed0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
14ee0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
14ef0 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ace);.  sqlite3P
14f00 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
14f10 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
14f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
14f30 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
14f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
14f50 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
14f60 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14f70 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
14f80 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
14f90 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
14fa0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
14fb0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
14fc0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
14fd0 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
14fe0 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
14ff0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
15000 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
15010 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
15020 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
15030 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
15040 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
15050 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
15060 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15070 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
15080 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
15090 65 52 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  eRef(pPg);.  ret
150a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
150b0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
150c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
150d0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
150e0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
150f0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
15100 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
15110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
15120 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
15130 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
15140 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
15150 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
15160 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
15170 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
15180 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
15190 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
151a0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
151b0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
151c0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
151d0 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
151e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
151f0 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
15200 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
15210 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
15220 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
15230 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
15240 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
15250 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
15260 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
15270 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
15280 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
15290 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
152a0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
152b0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
152c0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
152d0 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
152e0 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
152f0 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
15300 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
15310 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
15320 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
15330 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
15340 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
15350 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
15360 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
15370 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
15380 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
15390 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
153a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
153b0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
153c0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
153d0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
153e0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
153f0 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
15400 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
15410 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
15420 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
15430 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
15440 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
15450 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
15460 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
15470 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
15480 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
15490 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
154a0 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
154b0 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
154c0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
154d0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
154e0 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
154f0 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
15500 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
15510 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
15520 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
15530 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
15540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15550 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
15560 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
15570 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
15580 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
15590 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
155a0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
155b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
155c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
155d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
155e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
155f0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
15600 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15610 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
15620 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
15630 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
15640 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
15650 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
15660 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
15670 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
15680 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
15690 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
156a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
156b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
156c0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
156d0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
156e0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
156f0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
15700 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
15710 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
15720 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20  lOpen );..      
15730 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
15740 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
15750 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
15760 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
15770 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
15780 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
15790 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
157a0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
157b0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
157c0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
157d0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
157e0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
157f0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
15800 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
15810 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
15820 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
15830 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
15840 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
15850 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
15860 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
15870 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
15880 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
15890 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
158a0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
158b0 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
158c0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
158d0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
158e0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
158f0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
15900 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
15910 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
15920 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
15930 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
15940 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
15950 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
15960 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
15970 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15980 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
15990 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
159a0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
159b0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
159c0 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c          i64 jrnl
159d0 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Off;.        if(
159e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
159f0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
15a00 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
15a10 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
15a20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
15a30 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
15a40 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
15a50 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
15a60 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
15a70 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
15a80 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
15a90 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15aa0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
15ab0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15ad0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
15ae0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
15af0 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20        jrnlOff = 
15b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
15b10 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
15b20 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
15b30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
15b40 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
15b50 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66  , pPager, jrnlOf
15b60 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  f, 4));.        
15b70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
15b80 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
15b90 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e  nlOff, pPager->n
15ba0 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
15bb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15bd0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
15be0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
15bf0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
15c00 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
15c10 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
15c20 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
15c30 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  er));.        IO
15c40 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
15c50 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
15c60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15c70 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
15c80 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
15c90 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
15ca0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
15cb0 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
15cc0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
15cd0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
15ce0 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
15cf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
15d00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
15d10 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
15d20 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
15d30 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
15d40 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
15d50 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
15d60 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
15d70 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
15d80 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
15d90 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15da0 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
15db0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
15dc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
15dd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
15de0 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
15df0 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
15e00 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
15e10 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
15e20 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
15e30 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
15e40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15e50 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61  file. No calls a
15e60 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  re made.** to th
15e70 65 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20  e page-cache to 
15e80 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61  mark the pages a
15e90 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74  s clean. It is t
15ea0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15eb0 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c  y.** of the call
15ec0 65 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65  er to use Pcache
15ed0 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63  CleanAll() or Pc
15ee0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
15ef0 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70  to mark.** the p
15f00 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  ages as clean..*
15f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15f20 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
15f30 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
15f40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
15f50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15f60 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
15f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f80 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
15f90 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
15fa0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
15fb0 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
15fc0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
15fd0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
15fe0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
15ff0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
16000 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
16010 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
16020 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
16030 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
16040 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
16050 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
16060 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
16070 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
16080 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
16090 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
160a0 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
160b0 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
160c0 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
160d0 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
160e0 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
160f0 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
16100 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
16110 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
16120 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
16130 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
16140 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
16150 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
16160 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
16170 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
16180 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
16190 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
161a0 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
161b0 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
161c0 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
161d0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
161e0 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
161f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
16200 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
16210 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
16220 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
16230 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
16240 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
16250 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
16260 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
16270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
16280 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
16290 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
162a0 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
162b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
162c0 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
162d0 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
162e0 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
162f0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
16300 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
16310 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
16320 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
16330 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
16340 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
16360 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68  rn rc;.  }..  wh
16370 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
16380 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
16390 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
163a0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
163b0 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
163c0 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
163d0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
163e0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
163f0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
16400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16410 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
16420 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
16430 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
16440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
16450 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16460 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
16470 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
16480 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
16490 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
164a0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
164b0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
164c0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
164d0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
164e0 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
164f0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
16500 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
16510 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
16520 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
16530 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
16540 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
16550 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
16560 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
16570 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
16580 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
16590 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
165a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
165b0 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
165c0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
165d0 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
165e0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
165f0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61  eSize;.      cha
16600 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
16610 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
16620 3e 70 44 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70  >pData, pList->p
16630 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20 20 20 20  gno, 6);..      
16640 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f  PAGERTRACE4("STO
16650 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
16660 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16690 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61   pList->pgno, pa
166a0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
166b0 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  st));.      IOTR
166c0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
166d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
166e0 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
166f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16700 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
16710 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
16720 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
16730 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  et);.      PAGER
16740 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
16750 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
16760 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
16770 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
16780 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ite);.      if( 
16790 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
167a0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
167b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
167c0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
167d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
167e0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
167f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16800 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
16810 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16820 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16830 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
16840 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pList->pgno;.   
16850 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
16860 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
16870 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
16880 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
16890 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
168a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
168b0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
168c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
168d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
168e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
168f0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
16900 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
16910 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
16920 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
16930 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
16940 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
16950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16960 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16980 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
16990 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
169a0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
169b0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
169c0 20 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75   limit. The argu
169d0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
169e0 72 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65  r to a purgeable
169f0 20 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63   Pager .** objec
16a00 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
16a10 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b   attempts to mak
16a20 65 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79  e a single dirty
16a30 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 6e   page that has n
16a40 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67  o.** outstanding
16a50 20 72 65 66 65 72 65 6e 63 65 73 20 28 69 66 20   references (if 
16a60 6f 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65 61  one exists) clea
16a70 6e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  n so that it can
16a80 20 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a   be recycled .**
16a90 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
16aa0 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
16ab0 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
16ac0 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
16ad0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
16ae0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
16af0 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
16b00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
16b10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
16b20 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nc ){.    return
16b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16b40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
16b50 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
16b60 59 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Y );.  if( pPage
16b70 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
16b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16b90 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
16ba0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
16bb0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
16bc0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
16bd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16be0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
16bf0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
16c00 20 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d         !(pPager-
16c10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
16c20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
16c30 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
16c40 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
16c50 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
16c60 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
16c70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
16c80 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20  E_APPEND).      
16c90 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16ca0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
16cb0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
16cc0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
16cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16ce0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16d00 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
16d10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
16d20 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
16d30 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
16d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
16d60 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16d70 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
16d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
16da0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
16db0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  n(pPg);.  }.  re
16dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
16dd0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
16de0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
16df0 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
16e00 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
16e10 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
16e20 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
16e30 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
16e40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
16e50 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
16e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
16e70 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
16e80 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
16e90 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
16ea0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
16eb0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
16ec0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
16ed0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
16ee0 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
16ef0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
16f00 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  l..**.** Return 
16f10 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62  negative if unab
16f20 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
16f30 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
16f40 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
16f50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
16f60 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  es not open the 
16f70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
16f80 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63  examine its.** c
16f90 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20  ontent.  Hence, 
16fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
16fb0 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  t contain the na
16fc0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a  me of a master.*
16fd0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
16fe0 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  hat has been del
16ff0 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20  eted, and hence 
17000 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a  not be hot.  Or.
17010 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
17020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
17030 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74  ht be zeroed out
17040 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
17050 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63  ** does not disc
17060 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73  over these cases
17070 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f   of a non-hot jo
17080 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a  urnal - if the.*
17090 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  * journal file e
170a0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
170b0 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74   empty this rout
170c0 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a  ine assumes it.*
170d0 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70  * is hot.  The p
170e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
170f0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
17100 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a  cover that the.*
17110 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
17120 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
17130 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e   and will no-op.
17140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
17150 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
17160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
17170 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
17180 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
17190 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
171a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
171b0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  _OK;.  int exist
171c0 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63  s = 0;.  int loc
171d0 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ked = 0;.  asser
171e0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
171f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17200 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
17210 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17220 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
17230 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ;.  *pExists = 0
17240 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17250 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
17260 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
17270 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
17280 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
17290 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
172a0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
172b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
172c0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
172d0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
172e0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  , &locked);.  }.
172f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17300 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26  _OK && exists &&
17310 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
17320 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
17330 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17340 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
17350 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
17360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17370 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61   ){.     if( nPa
17380 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
17390 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
173a0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
173b0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
173c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173d0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
173e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
173f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17400 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
17410 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
17420 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
17430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
17450 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
17460 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
17470 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
17480 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
17490 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
174a0 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
174b0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
174c0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
174d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
174e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
174f0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
17500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17510 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
17520 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
17530 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
17540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
17550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17560 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17570 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
17580 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17590 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
175a0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
175b0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
175c0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
175d0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
175e0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
175f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17600 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
17610 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
17620 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
17630 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
17640 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
17650 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
17690 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
176a0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
176b0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
176c0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
176d0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
176e0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
176f0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
17710 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
17720 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
17730 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
17740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
17750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
17770 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
17780 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
17790 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
177a0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
177b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
177c0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
177d0 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
177e0 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
177f0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
17800 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
17810 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
17820 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
17830 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
17840 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
17850 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
17860 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
17870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
17880 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
17890 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
178a0 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
178b0 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
178c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
178d0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
178e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
178f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17900 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72  E_OK;.  int isEr
17910 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20  rorReset = 0;.. 
17920 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
17930 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
17940 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
17950 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
17960 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
17970 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
17980 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
17990 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
179a0 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
179b0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
179c0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
179d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
179e0 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
179f0 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
17a00 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
17a10 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
17a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
17a30 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
17a40 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
17a50 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
17a60 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
17a70 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26  ->pPCache)==0 &&
17a80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17a90 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
17aa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17ab0 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  en ){.      isEr
17ac0 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
17ad0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
17ae0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
17af0 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
17b00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
17b10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
17b20 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
17b30 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
17b40 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
17b50 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
17b60 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
17b70 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
17b80 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
17b90 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
17ba0 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
17bb0 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
17bc0 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
17bd0 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
17be0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17bf0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
17c00 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
17c10 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
17c20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
17c30 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
17c40 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17c50 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
17c60 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
17c70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
17c80 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
17c90 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
17ca0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
17cb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
17cc0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
17cd0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
17ce0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
17cf0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
17d00 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
17d10 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
17d20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
17d30 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
17d40 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
17d50 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
17d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17d80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17d90 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
17da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
17db0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17dc0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
17dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17de0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
17df0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a  D_LOCK );.    }.
17e00 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
17e10 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
17e20 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
17e30 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
17e40 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
17e50 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
17e60 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
17e70 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
17e80 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
17e90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
17ea0 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
17eb0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
17ec0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
17ed0 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
17ee0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f00 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
17f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17f20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
17f30 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
17f40 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
17f50 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
17f60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17f70 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
17f80 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
17f90 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
17fa0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
17fb0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
17fc0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
17fd0 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
17fe0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
17ff0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
18000 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
18010 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
18020 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18030 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
18040 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
18050 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
18060 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
18070 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
18080 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
18090 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
180a0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
180b0 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
180c0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
180d0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
180e0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
180f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
18100 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
18110 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
18120 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
18130 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
18140 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
18150 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f  il to.      ** o
18160 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
18170 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18190 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
181a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
181b0 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
181c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
181d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
181e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
181f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
18200 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18230 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
18240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
18250 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
18260 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
18270 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
18280 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
18290 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
182a0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
182b0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
182c0 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
182d0 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
182e0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
182f0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
18300 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
18310 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
18320 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
18330 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
18340 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
18350 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
18360 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
18370 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
18380 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
18390 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
183a0 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
183b0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
183c0 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
183d0 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
183e0 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72        if( !isErr
183f0 6f 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65  orReset && pPage
18400 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
18410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
18420 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
18430 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
18440 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
18450 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
18460 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
18470 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
18480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18490 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
184a0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
184b0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
184c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
184d0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
184e0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
184f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18500 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
18510 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
18520 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
18530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
18540 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18550 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
18560 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
18570 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
18580 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
185a0 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
185b0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
185c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
185d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
185e0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
185f0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
18600 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18610 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
18620 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18630 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
18640 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
18650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18670 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
18680 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
18690 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
186a0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
186b0 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
186c0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
186d0 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
186e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
186f0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18710 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18730 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18740 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
18750 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18760 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
18770 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  1;.      pPager-
18780 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
18790 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
187a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
187b0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
187c0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
187d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
187e0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
187f0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
18800 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
18810 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
18820 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
18830 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
18840 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
18850 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
18860 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
18870 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
18880 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
18890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
188a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
188b0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
188c0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
188d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
188e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
188f0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
18900 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
18910 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
18920 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
18930 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
18940 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
18950 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
18960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
18970 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
18980 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
18990 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
189a0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
189b0 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
189c0 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
189d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
189e0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
189f0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
18a00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
18a10 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
18a20 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
18a30 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
18a40 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
18a50 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
18a60 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
18a70 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
18a80 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
18a90 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
18aa0 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
18ab0 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
18ac0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
18ad0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
18ae0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
18af0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
18b00 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
18b10 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
18b20 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
18b30 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
18b40 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
18b50 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
18b60 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
18b70 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
18b80 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
18b90 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
18ba0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
18bb0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
18bc0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
18bd0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
18be0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
18bf0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
18c00 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
18c10 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
18c20 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
18c30 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
18c40 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
18c50 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
18c60 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
18c70 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
18c80 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
18c90 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
18ca0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
18cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
18cc0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
18cd0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
18ce0 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73  eVers)];.      s
18cf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18d00 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
18d10 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
18d20 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
18d30 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
18d40 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
18d50 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
18d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18d80 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
18d90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
18da0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
18db0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18dc0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
18dd0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
18de0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
18df0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18e00 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
18e10 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
18e20 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
18e30 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
18e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18e60 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
18e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
18e90 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
18ea0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
18eb0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
18ec0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
18ed0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
18ee0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
18ef0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
18f00 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
18f10 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
18f20 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
18f30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
18f40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
18f50 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
18f60 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
18f70 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
18f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18f90 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18fa0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18fb0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18fc0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
18fd0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
18fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18ff0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
19000 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
19010 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
19020 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
19030 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
19040 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
19050 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
19060 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19070 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
19080 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
19090 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
190a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
190b0 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
190c0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
190d0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
190e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
190f0 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
19100 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
19110 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
19120 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
19130 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
19140 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
19150 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
19160 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
19170 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
19180 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
19190 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
191a0 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
191b0 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
191c0 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
191d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
191e0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41  s&PGHDR_NEED_REA
191f0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  D ){.    int rc 
19200 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
19210 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
19220 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
19230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19240 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66   ){.      pPg->f
19250 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
19260 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65  EED_READ;.    }e
19270 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
19280 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
19290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
192a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
192b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
192c0 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
192d0 7a 65 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61  zero, and the pa
192e0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  ger is not in th
192f0 65 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61  e.** middle of a
19300 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
19310 6f 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20  on or opened in 
19320 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
19330 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73  unlock it..*/ .s
19340 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
19350 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
19360 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19370 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61   if( (sqlite3Pca
19380 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
19390 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
193a0 0a 20 20 20 20 26 26 20 28 21 70 50 61 67 65 72  .    && (!pPager
193b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
193c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
193d0 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20  alOff>0) .  ){. 
193e0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
193f0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
19400 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19410 44 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d  Drop a page from
19420 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
19430 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
19440 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  op()..**.** If t
19450 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20  his means there 
19460 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73  are now no pages
19470 20 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73   with references
19480 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c   to them, a roll
19490 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61  back.** occurs a
194a0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
194b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
194c0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  emoved..*/.stati
194d0 63 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70  c void pagerDrop
194e0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67  Page(DbPage *pPg
194f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19500 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
19510 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
19520 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61  eDrop(pPg);.  pa
19530 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
19540 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  d(pPager);.}../*
19550 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
19560 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
19570 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
19580 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
19590 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
195a0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
195b0 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
195c0 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
195d0 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
195e0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
195f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19600 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
19610 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
19620 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
19630 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
19640 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
19650 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
19660 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
19670 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
19680 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
19690 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
196a0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
196b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
196c0 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
196d0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
196e0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
196f0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
19700 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
19710 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
19720 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
19730 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
19740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
19750 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
19760 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
19770 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
19780 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
19790 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
197a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
197b0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
197c0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
197d0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
197e0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
197f0 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
19800 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
19810 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
19820 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
19830 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
19840 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
19850 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
19860 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
19870 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
19880 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
19890 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
198a0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
198b0 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
198c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
198d0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
198e0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
198f0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
19900 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
19910 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
19920 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
19930 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
19940 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
19950 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
19960 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
19970 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
19980 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
19990 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
199a0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
199b0 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
199c0 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
199d0 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
199e0 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f  disk..** If noCo
199f0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
19a00 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19a10 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19a20 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
19a30 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  * of the page at
19a40 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64   this time, so d
19a50 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20  o not do a disk 
19a60 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c  read.  Just fill
19a70 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   in the.** page 
19a80 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
19a90 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68  os.  But mark th
19aa0 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68  e fact that we h
19ab0 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65  ave not read the
19ac0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73  .** content by s
19ad0 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
19ae0 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20  .needRead flag. 
19af0 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a   Later on, if .*
19b00 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
19b10 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
19b20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20  on this page or 
19b30 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
19b40 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61  is.** called aga
19b50 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  in with noConten
19b60 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==0, that means
19b70 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
19b80 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61  t is needed.** a
19b90 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64  nd the disk read
19ba0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
19bb0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
19bc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
19bd0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
19be0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
19bf0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
19c00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19c10 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
19c20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
19c30 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
19c40 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
19c50 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
19c60 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
19c70 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
19c80 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
19c90 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
19ca0 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
19cb0 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
19cc0 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
19cd0 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
19ce0 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  Pg = 0;.  int rc
19cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
19d00 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19d10 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20  R_UNLOCK .      
19d20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
19d30 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
19d40 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20  ->pPCache)>0 .  
19d50 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a       || pgno==1.
19d60 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    );..  /* The m
19d70 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
19d80 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
19d90 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19da0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
19db0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
19dc0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
19dd0 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
19de0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
19df0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
19e00 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
19e10 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
19e20 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
19e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19e50 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
19e60 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
19e70 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
19e80 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
19e90 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
19ea0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
19eb0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
19ec0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
19ed0 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
19ee0 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
19ef0 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
19f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
19f10 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
19f20 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
19f30 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
19f40 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
19f50 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
19f60 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
19f70 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
19f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19f90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
19fa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19fb0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
19fc0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
19fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
19fe0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
19ff0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
1a000 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  1, &pPg);.  if( 
1a010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a020 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a030 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
1a040 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
1a050 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
1a060 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
1a070 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
1a080 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
1a090 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
1a0a0 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  alized..    */. 
1a0b0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1a0c0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1a0d0 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
1a0e0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1a0f0 61 67 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ager;.    memset
1a100 28 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c  (pPg->pExtra, 0,
1a110 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
1a120 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1a130 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1a140 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
1a150 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a170 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1a180 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
1a190 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a1a0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1a1b0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1a1c0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
1a1d0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1a1e0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1a1f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a200 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1a210 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1a220 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1a230 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
1a240 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1a250 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a260 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ze);.      if( n
1a270 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1a280 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1a290 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41  = PGHDR_NEED_REA
1a2a0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  D;.      }.     
1a2b0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
1a2c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1a2d0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
1a2e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1a2f0 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
1a300 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
1a310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a320 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1a330 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1a340 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1a350 20 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   /* sqlite3Pager
1a360 55 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20  Unref(pPg); */. 
1a370 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70         pagerDrop
1a380 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1a390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
1a3b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1a3c0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
1a3d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1a3e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1a3f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1a400 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1a410 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
1a420 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
1a430 2f 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c  /.    assert(sql
1a440 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
1a450 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1a460 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  he)>0 || pgno==1
1a470 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
1a480 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
1a490 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
1a4a0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
1a4b0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1a4c0 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
1a4d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1a4e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1a4f0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1a500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1a520 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
1a530 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a540 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1a550 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1a560 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1a570 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1a580 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1a590 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1a5a0 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1a5b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1a5c0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1a5d0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a5e0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1a5f0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1a600 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
1a610 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1a620 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
1a630 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
1a640 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
1a650 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
1a660 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
1a670 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
1a680 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
1a690 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1a6a0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
1a6b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1a6c0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1a6d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1a6e0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
1a6f0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
1a700 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
1a710 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
1a720 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
1a730 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1a740 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1a750 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
1a760 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a770 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1a780 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1a790 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
1a7a0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a7b0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
1a7c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
1a7d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
1a7e0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
1a7f0 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ULL).  ){.    sq
1a800 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
1a810 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1a820 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
1a830 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1a840 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
1a850 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
1a860 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
1a870 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1a880 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
1a890 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
1a8a0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
1a8b0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
1a8c0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
1a8d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
1a8e0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
1a8f0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
1a900 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
1a910 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1a920 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
1a930 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
1a940 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
1a950 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
1a960 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
1a970 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1a980 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
1a990 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
1a9a0 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
1a9b0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
1a9c0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  d(pPager);.  }. 
1a9d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a9e0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1a9f0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
1aa00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1aa10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1aa20 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
1aa30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1aa40 26 26 20 21 70 50 61 67 65 72 2d 3e 73 6a 66 64  && !pPager->sjfd
1aa50 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1aa60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1aa70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1aa80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1aa90 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
1aaa0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
1aab0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
1aac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1aae0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
1aaf0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
1ab00 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
1ab10 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
1ab20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1ab30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
1ab40 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
1ab50 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
1ab60 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
1ab70 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
1ab80 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
1ab90 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1aba0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
1abb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1abc0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
1abd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1abe0 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
1abf0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
1ac00 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
1ac10 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
1ac20 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
1ac30 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
1ac40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
1ac50 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
1ac60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
1ac70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1ac80 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1ac90 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
1aca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1acb0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
1acc0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
1acd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1ace0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1acf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ad00 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1ad10 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
1ad20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1ad30 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1ad40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1ad50 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1ad60 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1ad70 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70  (pPager, 0);.  p
1ad80 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1ad90 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
1ada0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1adb0 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70  dbSize);.  if( p
1adc0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1add0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1ade0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1adf0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1ae00 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1ae10 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1ae20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1ae30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
1ae40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1ae50 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
1ae60 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
1ae70 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
1ae80 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1ae90 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NAL);.    }else{
1aea0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
1aeb0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
1aec0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
1aed0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
1aee0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1aef0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1af00 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
1af10 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
1af20 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
1af30 66 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  fd);.      rc = 
1af40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1af50 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
1af60 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
1af70 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63  C_WRITE.      rc
1af80 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
1af90 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
1afa0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
1afb0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1afc0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
1afd0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
1afe0 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  er).      );.#el
1aff0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  se.      rc = sq
1b000 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1b010 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1b020 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
1b030 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64   flags, 0);.#end
1b040 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  if.    }.    ass
1b050 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1b060 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
1b070 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
1b080 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b090 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
1b0a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1b0b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b0c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
1b0d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b100 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
1b110 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1b120 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1b130 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
1b140 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1b150 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1b160 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  ournal;.    }.  
1b170 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1b180 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
1b190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1b1a0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
1b1b0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1b1c0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
1b1d0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
1b1e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1b1f0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
1b200 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f  >errCode;.    go
1b210 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1b220 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1b230 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1b240 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1b250 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
1b260 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1b270 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
1b280 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
1b290 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1b2a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  K ){.    rc = op
1b2b0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
1b2c0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
1b2d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1b2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
1b2f0 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  M && rc!=SQLITE_
1b300 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
1b310 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1b320 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1b330 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  ager, 0);.    if
1b340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b350 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b360 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1b370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b380 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
1b390 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
1b3a0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
1b3b0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
1b3c0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
1b3d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
1b3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b3f0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1b400 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1b410 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
1b420 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
1b430 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
1b440 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1b450 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
1b460 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1b470 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1b480 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1b490 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1b4a0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  erRollback() is 
1b4b0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1b4c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1b4d0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
1b4e0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
1b4f0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61  gerUnref() is ca
1b500 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
1b510 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1b520 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1b530 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
1b540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b550 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
1b560 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
1b570 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
1b580 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
1b590 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
1b5a0 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
1b5b0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
1b5c0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
1b5d0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1b5e0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
1b5f0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
1b600 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
1b610 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
1b620 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1b630 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
1b640 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
1b650 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
1b660 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
1b670 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
1b680 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
1b690 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
1b6a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b6b0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
1b6c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
1b6d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
1b6e0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
1b6f0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
1b700 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
1b710 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
1b720 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
1b730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1b740 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
1b750 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
1b760 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
1b770 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1b780 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
1b790 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1b7a0 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
1b7b0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
1b7c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1b7d0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
1b7e0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
1b7f0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
1b800 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1b810 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
1b820 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
1b830 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
1b840 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
1b850 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
1b860 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
1b870 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
1b880 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
1b890 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
1b8a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
1b8b0 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67  egin(DbPage *pPg
1b8c0 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20  , int exFlag){. 
1b8d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1b8e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b8f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b900 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1b910 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
1b920 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b930 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1b940 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
1b950 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1b960 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
1b970 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1b980 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1b990 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1b9a0 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  DB );.    rc = s
1b9b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1b9c0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
1b9d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
1b9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b9f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1ba00 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
1ba10 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
1ba20 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
1ba30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ba40 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1ba50 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1ba60 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
1ba70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1ba80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ba90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1baa0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
1bab0 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
1bac0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
1bad0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
1bae0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1baf0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  r));.    if( pPa
1bb00 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1bb10 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1bb20 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
1bb30 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1bb40 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1bb50 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
1bb60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1bb70 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1bb80 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1bb90 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1bba0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1bbb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bbc0 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
1bbd0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1bbe0 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
1bbf0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
1bc00 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61  cess mode the la
1bc10 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
1bc20 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
1bc30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1bc40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
1bc50 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
1bc60 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
1bc70 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
1bc80 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
1bc90 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
1bca0 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
1bcb0 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20   and either was 
1bcc0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1bcd0 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64  ytes or its head
1bce0 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76  er was.    ** ov
1bcf0 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a  erwritten with z
1bd00 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
1bd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bd20 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1bd30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bd40 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
1bd50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bd60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
1bd70 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1bd80 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1bd90 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1bda0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1bdb0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
1bdc0 65 63 43 72 65 61 74 65 28 20 70 50 61 67 65 72  ecCreate( pPager
1bdd0 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  ->dbSize );.    
1bde0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e  if( !pPager->pIn
1bdf0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
1be00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1be10 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1be20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
1be30 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
1be40 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
1be50 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1be60 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1be70 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1be80 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1be90 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
1bea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
1beb0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
1bec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bed0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
1bee0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1bef0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1bf00 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1bf10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1bf20 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1bf30 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1bf40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1bf50 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1bf60 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1bf70 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1bf80 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1bf90 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1bfa0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1bfb0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1bfc0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1bfd0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1bfe0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1bff0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1c000 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1c010 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1c020 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1c030 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c040 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1c050 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1c060 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1c070 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1c080 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1c090 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1c0a0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1c0b0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1c0c0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c0d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1c0e0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c0f0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1c100 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1c110 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1c120 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1c130 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c140 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1c150 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1c160 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1c170 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1c180 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1c190 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1c1a0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1c1b0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1c1c0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1c1d0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1c1e0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c1f0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1c200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c210 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1c220 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1c230 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
1c240 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1c250 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c270 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
1c280 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
1c290 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1c2a0 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
1c2b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c2c0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1c2d0 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
1c2e0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
1c2f0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
1c300 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
1c310 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1c320 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
1c330 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  E(pPg);..  /* If
1c340 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70   this page was p
1c350 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
1c360 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
1c370 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==1, that means
1c380 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20  .  ** we didn't 
1c390 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74  really read in t
1c3a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1c3b0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61  e page.  This ca
1c3c0 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66  n happen.  ** (f
1c3d0 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e  or example) when
1c3e0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
1c3f0 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
1c400 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20  freelist.  But. 
1c410 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28   ** now we are (
1c420 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20  perhaps) moving 
1c430 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20  the page off of 
1c440 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72  the freelist for
1c450 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20  .  ** reuse and 
1c460 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
1c470 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
1c480 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e  tent so that con
1c490 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65  tent.  ** can be
1c4a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
1c4b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1c4c0 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64    So do the read
1c4d0 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69   at this.  ** ti
1c4e0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  me..  */.  rc = 
1c4f0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1c500 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63  t(pPg);.  if( rc
1c510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1c520 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  c;.  }..  /* Mar
1c530 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
1c540 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
1c550 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1c560 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
1c570 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
1c580 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
1c590 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
1c5a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
1c5b0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
1c5c0 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
1c5d0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
1c5e0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1c5f0 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67  pPg) ){.    pPag
1c600 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1c610 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1c620 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
1c630 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
1c640 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
1c650 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
1c660 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1c670 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
1c680 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
1c690 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1c6a0 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
1c6b0 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
1c6c0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
1c6d0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1c6e0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
1c6f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c700 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
1c710 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
1c720 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
1c730 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
1c740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c750 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1c760 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
1c770 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1c780 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  in(pPg, 0);.    
1c790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c7a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1c7b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c7c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c7d0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1c7e0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
1c7f0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1c800 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
1c810 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
1c820 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
1c830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1c840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1c850 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OFF ){.      rc 
1c860 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1c870 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1c880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c890 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1c8a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
1c8b0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c8c0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1c8d0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
1c8e0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
1c8f0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1c900 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
1c910 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
1c920 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
1c930 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1c940 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
1c950 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
1c960 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1c970 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
1c980 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1c990 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
1c9a0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1c9b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c9c0 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
1c9d0 70 50 67 29 20 26 26 20 70 50 61 67 65 72 2d 3e  pPg) && pPager->
1c9e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1c9f0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
1ca00 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
1ca10 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
1ca20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
1ca30 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1ca40 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  2;..        /* W
1ca50 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
1ca60 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1ca70 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
1ca80 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
1ca90 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
1caa0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
1cab0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1cac0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
1cad0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
1cae0 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
1caf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1cb00 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1cb10 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1cb20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
1cb30 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1cb40 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1cb50 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  , 7);.        ck
1cb60 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
1cb70 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
1cb80 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
1cb90 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1cba0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1cbb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cbc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1cbd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cbf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cc00 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1cc10 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
1cc20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1cc50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cc60 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   + 4);.         
1cc70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cc80 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
1cc90 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
1cca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ccb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ccc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ccd0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1cce0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1ccf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b  ->journalOff, ck
1cd00 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
1cd10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cd20 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
1cd30 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1cd40 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
1cd50 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
1cd60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cd90 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
1cda0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
1cdb0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1cdc0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
1cdd0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
1cde0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f   PAGERTRACE5("JO
1cdf0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1ce00 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
1ce10 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1ce20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1ce30 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1ce40 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
1ce50 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
1ce60 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
1ce70 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
1ce80 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20  ehash(pPg));..  
1ce90 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
1cea0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
1ceb0 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
1cec0 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
1ced0 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
1cee0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
1cef0 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
1cf00 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
1cf10 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
1cf20 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
1cf30 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
1cf40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1cf50 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
1cf60 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
1cf70 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
1cf80 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
1cf90 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
1cfa0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
1cfb0 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
1cfc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1cfd0 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
1cfe0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1cff0 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
1d000 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
1d010 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
1d020 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
1d030 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
1d040 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1d050 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
1d060 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1d070 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
1d080 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1d090 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1d0a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1d0b0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
1d0c0 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
1d0d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d0e0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
1d0f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
1d100 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
1d110 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
1d120 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
1d130 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
1d140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d150 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d160 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
1d170 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1d180 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
1d190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1d1a0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1d1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1d1c0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
1d1d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
1d1e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d1f0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
1d200 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
1d210 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1d220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d230 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1d240 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
1d250 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1d260 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
1d270 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1d280 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
1d290 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1d2a0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1d2b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
1d2c0 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44  ERTRACE4("APPEND
1d2d0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1d2e0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1d300 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1d310 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1d320 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
1d330 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d340 59 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20 20 20  YNC)?1:0));.    
1d350 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1d360 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
1d370 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1d380 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
1d390 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
1d3a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
1d3b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1d3c0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
1d3d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
1d3e0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
1d3f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1d400 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
1d410 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
1d420 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
1d430 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
1d440 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
1d450 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
1d460 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
1d470 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
1d480 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
1d490 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1d4a0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
1d4b0 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
1d4c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1d4d0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1d4e0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1d4f0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1d500 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 61 73 73  o, 7);.      ass
1d510 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e  ert( pageInJourn
1d520 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  al(pPg) || pPg->
1d530 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1d540 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
1d550 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1d560 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
1d570 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
1d580 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1d590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d5a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d5b0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1d5c0 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
1d5d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d5e0 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
1d5f0 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45      }.      PAGE
1d600 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1d610 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1d620 20 40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49   @ %d\n", PAGERI
1d630 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1d640 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1d650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d660 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d670 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d680 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1d690 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Rec++;.      ass
1d6a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1d6b0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1d6c0 20 20 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e     addToSavepoin
1d6d0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
1d6e0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d6f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
1d700 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
1d710 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
1d720 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1d730 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1d740 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1d750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1d760 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
1d770 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
1d780 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
1d790 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d7a0 2d 3e 64 62 53 69 7a 65 3d 3d 28 50 41 47 45 52  ->dbSize==(PAGER
1d7b0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1d7c0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  -1) ){.      pPa
1d7d0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1d7e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d810 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
1d820 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
1d830 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
1d840 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
1d850 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
1d860 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
1d870 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1d880 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
1d890 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
1d8a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1d8b0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1d8c0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1d8d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
1d8e0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1d8f0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
1d900 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
1d910 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1d920 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
1d930 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
1d940 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
1d950 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
1d960 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
1d970 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
1d980 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
1d990 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1d9a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
1d9b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1d9c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d9d0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
1d9e0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
1d9f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1da00 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
1da10 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1da20 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1da30 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
1da40 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
1da50 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
1da60 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
1da70 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
1da80 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
1da90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
1daa0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
1dab0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1dac0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1dad0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1dae0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1db00 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1db10 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1db20 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
1db30 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1db40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1db50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1db60 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
1db70 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
1db80 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
1db90 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
1dba0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
1dbb0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
1dbc0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
1dbd0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
1dbe0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
1dbf0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
1dc00 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
1dc10 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
1dc20 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
1dc30 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
1dc40 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
1dc50 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
1dc60 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1dc70 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1dc80 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1dc90 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1dca0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1dcb0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1dcc0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1dcd0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1dce0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1dcf0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1dd00 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1dd10 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1dd20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1dd30 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1dd40 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1dd50 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1dd60 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1dd70 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1dd80 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1dd90 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74   + 1;..    sqlit
1dda0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1ddb0 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
1ddc0 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
1ddd0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1dde0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1ddf0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1de00 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1de10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1de20 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1de30 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1de40 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1de50 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1de60 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1de70 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1de80 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1de90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1dea0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1deb0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1dec0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1ded0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1dee0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1def0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1df00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1df10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1df20 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1df30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
1df40 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
1df50 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
1df60 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
1df70 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
1df80 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
1df90 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
1dfa0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1dfb0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1dfc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dfd0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
1dfe0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1dff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e010 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1e020 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1e030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
1e040 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1e050 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1e060 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
1e070 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1e080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1e090 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
1e0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e0c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1e0d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e0e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e0f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
1e100 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
1e110 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
1e120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1e130 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
1e140 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1e150 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
1e160 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
1e170 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1e180 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
1e190 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1e1a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e1b0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e1c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
1e1d0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
1e1e0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
1e1f0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
1e200 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
1e210 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
1e220 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
1e230 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
1e240 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
1e250 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
1e260 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
1e270 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
1e280 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
1e290 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
1e2a0 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
1e2b0 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
1e2c0 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
1e2d0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
1e2e0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1e2f0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
1e300 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
1e310 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
1e320 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
1e330 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
1e340 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
1e350 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
1e360 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
1e370 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1e380 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
1e390 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
1e3a0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
1e3b0 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e   pPage ) pPage->
1e3c0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1e3d0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1e3e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1e3f0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1e400 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1e410 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
1e420 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
1e430 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1e440 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
1e450 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1e460 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
1e470 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1e480 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
1e490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e4a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1e4b0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1e4c0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1e4d0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1e4e0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1e4f0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1e500 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
1e510 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1e520 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1e530 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1e540 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e550 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1e560 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1e570 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1e580 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
1e590 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
1e5a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1e5b0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
1e5c0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1e5d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1e5e0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1e5f0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1e600 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1e610 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1e620 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
1e630 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1e640 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1e650 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1e660 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1e670 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
1e680 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
1e690 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
1e6a0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
1e6b0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
1e6c0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
1e6d0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
1e6e0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
1e6f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
1e700 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1e710 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1e720 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1e730 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1e740 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1e750 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1e760 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1e770 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1e780 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1e790 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1e7a0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1e7b0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1e7c0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1e7d0 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1e7e0 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1e7f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1e800 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1e810 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1e820 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1e830 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1e840 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1e850 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1e860 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1e870 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1e880 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e890 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1e8a0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1e8b0 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1e8c0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1e8d0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e8e0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1e8f0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
1e900 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
1e910 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
1e920 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1e930 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
1e940 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
1e950 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
1e960 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1e970 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
1e980 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
1e990 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
1e9a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
1e9b0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
1e9c0 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
1e9d0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1e9e0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
1e9f0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1ea00 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
1ea10 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
1ea20 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1ea30 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1ea40 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
1ea50 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
1ea60 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1ea70 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
1ea80 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1ea90 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1eaa0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
1eab0 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
1eac0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1ead0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1eae0 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
1eaf0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
1eb00 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1eb10 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
1eb20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1eb30 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
1eb40 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1eb50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1eb60 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1eb70 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1eb80 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1eb90 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ;..  if( pPg->pg
1eba0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1ebb0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  gSize ){.    ret
1ebc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ebd0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1ebe0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1ebf0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1ec00 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1ec10 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1ec20 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
1ec30 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 42 69  back = sqlite3Bi
1ec40 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
1ec50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
1ec60 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1ec70 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1ec80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ec90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1eca0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
1ecb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1ecc0 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
1ecd0 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
1ece0 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  gno);..  if( rc=
1ecf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
1ed00 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1ed10 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
1ed20 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
1ed30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ed40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1ed50 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1ed60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1ed70 53 69 7a 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  Size==pPg->pgno 
1ed80 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  && pPager->dbOri
1ed90 67 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  gSize<pPager->db
1eda0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1edb0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1edc0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1edd0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1ede0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1edf0 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1ee00 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1ee10 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1ee20 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1ee30 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1ee40 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1ee50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ee60 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1ee70 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1ee80 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1ee90 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1eea0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1eeb0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1eec0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1eed0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1eee0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1eef0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1ef00 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1ef10 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1ef20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1ef30 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1ef40 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1ef50 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1ef60 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1ef70 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1ef80 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1ef90 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1efa0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1efb0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1efc0 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
1efd0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1efe0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1eff0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1f000 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
1f010 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1f020 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
1f030 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1f040 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
1f050 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  TE;.#ifdef SQLIT
1f060 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1f070 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1f080 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1f090 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1f0a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f0b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f0c0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1f0d0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1f0e0 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1f0f0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1f100 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1f110 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1f120 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1f130 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1f140 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1f150 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1f160 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1f170 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1f180 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1f190 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1f1a0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76  .**.** If we hav
1f1b0 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c  e not yet actual
1f1c0 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  ly read the cont
1f1d0 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65  ent of this page
1f1e0 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64   (if.** the PgHd
1f1f0 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  r.needRead flag 
1f200 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69  is set) then thi
1f210 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61  s routine acts a
1f220 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74  s a promise.** t
1f230 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hat we will neve
1f240 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74  r need to read t
1f250 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1f260 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a  in the future..*
1f270 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61  * so the needRea
1f280 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c  d flag can be cl
1f290 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f  eared at this po
1f2a0 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  int..*/.void sql
1f2b0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1f2c0 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1f2d0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1f2e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1f2f0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1f300 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1f310 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
1f320 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1f330 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1f340 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69  open, or DontWri
1f350 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  te() has been ca
1f360 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69  lled on.  ** thi
1f370 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74  s page (DontWrit
1f380 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77  e() sets the alw
1f390 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1f3a0 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  ), then this.  *
1f3b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
1f3c0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1f3d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f3e0 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  lOpen==0 .   || 
1f3f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
1f400 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  t(pPager->pAlway
1f410 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e  sRollback, pPg->
1f420 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d  pgno).   || pPg-
1f430 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1f440 4f 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20 20  OrigSize.  ){.  
1f450 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23    return;.  }..#
1f460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
1f470 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28  URE_DELETE.  if(
1f480 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
1f490 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
1f4a0 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
1f4b0 29 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  )!=0.   || pPg->
1f4c0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1f4d0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  rigSize ){.    r
1f4e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
1f4f0 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
1f500 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
1f510 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
1f520 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
1f530 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
1f540 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1f550 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
1f560 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
1f570 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
1f580 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
1f590 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
1f5a0 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
1f5b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
1f5c0 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
1f5d0 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
1f5e0 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
1f5f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1f600 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
1f610 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a  ust be met..  **
1f620 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20  .  ** (Later:)  
1f630 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68  Not true.  If th
1f640 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
1f650 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e  rrupted by havin
1f660 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a  g duplicate.  **
1f670 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f680 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72  eelist (ex: corr
1f690 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20  upt9.test) then 
1f6a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1f6b0 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
1f6c0 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f  arily true:.  */
1f6d0 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70  .  /* assert( !p
1f6e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1f6f0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1f700 3c 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  <= pPager->dbOri
1f710 67 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61  gSize ); */..  a
1f720 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1f730 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1f740 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
1f750 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
1f760 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
1f770 29 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  );.  pPg->flags 
1f780 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
1f790 45 41 44 3b 0a 20 20 61 64 64 54 6f 53 61 76 65  EAD;.  addToSave
1f7a0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1f7b0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1f7c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
1f7d0 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
1f7e0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1f7f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1f800 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
1f810 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
1f820 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1f830 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d  r, pPg->pgno)).}
1f840 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1f850 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1f860 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
1f870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
1f880 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
1f890 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
1f8a0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
1f8b0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1f8c0 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
1f8d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
1f8e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1f8f0 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67   isDirect){.  Pg
1f900 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1f910 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1f920 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1f930 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65  LITE_OK;..#ifnde
1f940 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f950 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 61  ATOMIC_WRITE.  a
1f960 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 3d  ssert( isDirect=
1f970 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72 65  =0 );  /* isDire
1f980 63 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65 20  ct is only true 
1f990 66 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74 65  for atomic write
1f9a0 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66  s */.#endif.  if
1f9b0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
1f9c0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
1f9d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
1f9e0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  {.    /* Open pa
1f9f0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1fa00 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1fa10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fa20 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1fa30 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
1fa40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fa50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1fa60 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44 69  ;..    if( !isDi
1fa70 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63  rect ){.      rc
1fa80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1fa90 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
1faa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fad0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
1fae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1faf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fb00 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1fb10 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1fb20 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1fb30 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1fb40 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
1fb50 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1fb60 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1fb70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1fb80 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  );.    change_co
1fb90 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
1fba0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1fbb0 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
1fbc0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1fbd0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1fbe0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
1fbf0 57 52 49 54 45 0a 20 20 20 20 69 66 28 20 69 73  WRITE.    if( is
1fc00 44 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72  Direct && pPager
1fc10 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1fc20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f  {.      const vo
1fc30 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64  id *zBuf = pPgHd
1fc40 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
1fc50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fc60 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
1fc70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fc80 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1fc90 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
1fca0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
1fcb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1fcc0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
1fcd0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1fce0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1fcf0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1fd00 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
1fd10 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1fd20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
1fd30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fd40 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
1fd50 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ile to disk..*/.
1fd60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1fd70 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
1fd80 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1fd90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1fda0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1fdb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1fdc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1fdd0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1fde0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1fdf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fe00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
1fe10 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1fe20 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1fe30 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1fe40 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1fe50 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1fe60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fe70 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1fe80 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fe90 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1fea0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1feb0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1fec0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1fed0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1fee0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1fef0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1ff00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1ff10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ff20 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1ff30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1ff40 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1ff50 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1ff60 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1ff70 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1ff80 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1ff90 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1ffa0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1ffb0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1ffc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1ffd0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1ffe0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1fff0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
20000 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
20010 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
20020 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
20030 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
20040 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
20050 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
20060 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
20070 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
20080 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
20090 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
200a0 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
200b0 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
200c0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
200d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
200e0 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
200f0 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
20100 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
20110 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
20120 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
20130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20140 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
20150 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
20160 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
20170 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20180 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
20190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
201a0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
201b0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
201c0 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
201d0 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 69 6e   *zMaster, .  in
201e0 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e  t noSync.){.  in
201f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20200 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
20210 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
20220 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
20230 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
20240 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  * If no changes 
20250 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
20260 77 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65  we can leave the
20270 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72   transaction ear
20280 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
20290 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
202a0 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
202b0 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
202c0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
202d0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
202e0 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
202f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20300 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
20310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
20320 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
20330 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20340 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
20350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20360 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  }..  PAGERTRACE4
20370 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
20380 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
20390 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
203a0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
203b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
203c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
203d0 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ze);..  /* If th
203e0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
203f0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
20400 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
20410 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
20420 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
20430 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
20440 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
20450 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
20460 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
20470 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
20480 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
20490 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
204a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
204b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
204c0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
204d0 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ITE.    /* The a
204e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
204f0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
20500 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  used if all of t
20510 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
20520 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
20530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
20540 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
20550 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
20560 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
20570 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20  rty for.    **  
20580 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
20590 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
205a0 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  d.    **    + Th
205b0 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
205c0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
205d0 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
205e0 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  n, and.    **   
205f0 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70   + Exactly one p
20600 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  age has been mod
20610 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20  ified and store 
20620 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
20630 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
20640 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
20650 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
20660 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ed, then the jou
20670 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
20680 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63  ever.    ** be c
20690 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
206a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
206b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41   */.    int useA
206c0 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20 20 20 20  tomicWrite;.    
206d0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
206e0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
206f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
20700 20 20 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74     useAtomicWrit
20710 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a  e = (.        !z
20720 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20  Master && .     
20730 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20740 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20  alOpen &&.      
20750 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20760 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
20770 53 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20  Size(pPager) && 
20780 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20790 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d  >dbSize>=pPager-
207a0 3e 64 62 46 69 6c 65 53 69 7a 65 20 26 26 20 0a  >dbFileSize && .
207b0 20 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20          (pPg==0 
207c0 7c 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d  || pPg->pDirty==
207d0 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  0).    );.    as
207e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
207f0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
20800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20810 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20820 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
20830 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  f( useAtomicWrit
20840 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70  e ){.      /* Up
20850 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
20860 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eld in the journ
20870 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
20880 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70    int offset = p
20890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
208a0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
208b0 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
208c0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
208d0 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nRec==1);.      
208e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
208f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66  (pPager->jfd, of
20900 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52  fset, pPager->nR
20910 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ec);..      /* U
20920 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
20930 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
20940 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
20950 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
20960 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
20970 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
20980 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
20990 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
209a0 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  updated.      **
209b0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
209c0 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
209d0 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74  age 1 directly t
209e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
209f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65       ** file. Be
20a00 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
20a10 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
20a20 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
20a30 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20  ile-system, .   
20a40 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61     ** this is sa
20a50 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
20a60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20a80 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
20a90 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
20aa0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
20ab0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
20ac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
20ad0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
20ae0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
20af0 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74  ..    if( !useAt
20b00 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d  omicWrite && rc=
20b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e  =SQLITE_OK ).#en
20b20 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  dif..    /* If a
20b30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20b40 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
20b50 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
20b60 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
20b70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
20b80 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
20b90 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
20ba0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
20bb0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
20bc0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
20bd0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
20be0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
20bf0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
20c00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
20c10 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
20c20 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
20c30 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
20c40 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20c50 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
20c60 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
20c70 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
20c80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
20c90 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
20ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20cb0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
20cc0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
20cd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20cf0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20d00 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
20d10 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
20d20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
20d30 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  F ){.#ifndef SQL
20d40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20d50 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
20d60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
20d70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20d80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
20d90 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
20da0 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
20db0 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
20dc0 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
20dd0 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ges.          **
20de0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
20df0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
20e00 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
20e10 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
20e20 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  l.          ** f
20e30 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
20e40 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  /.          Pgno
20e50 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67   i;.          Pg
20e60 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  no iSkip = PAGER
20e70 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
20e80 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
20e90 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
20ea0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
20eb0 20 20 20 20 66 6f 72 28 20 69 3d 70 50 61 67 65      for( i=pPage
20ec0 72 2d 3e 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d  r->dbSize+1; i<=
20ed0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
20ee0 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
20ef0 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
20f00 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
20f10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
20f20 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
20f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20f50 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
20f60 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
20f70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20f80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20f90 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20fa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20fb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20fc0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
20fd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20fe0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
20ff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
21010 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
21020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21030 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20        } .       
21040 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
21050 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
21060 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21070 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
21080 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
21090 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
210a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
210b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
210c0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
210d0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
210e0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
210f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
21100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21110 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
21120 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
21130 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21140 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
21150 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
21160 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
21170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21180 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
21190 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
211a0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  dbSize);.      i
211b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
211c0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
211d0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
211e0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
211f0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
21200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21210 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
21220 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
21230 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
21240 50 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20  PCache);.    rc 
21250 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
21260 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
21270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
21290 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
212a0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
212b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72        /* The err
212c0 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65  or might have le
212d0 66 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  ft the dirty lis
212e0 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20  t all fouled up 
212f0 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62  here,.      ** b
21300 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ut that does not
21310 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20   matter because 
21320 69 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69  if the if the di
21330 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20  rty list did.   
21340 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70     ** get corrup
21350 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72  ted, then the tr
21360 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72  ansaction will r
21370 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20  oll back and.   
21380 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
21390 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54  e dirty list.  T
213a0 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72  here is an asser
213b0 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  t in.      ** pa
213c0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
213d0 79 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76  y_pages() that v
213e0 65 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20  erifies that no 
213f0 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a  attempt.      **
21400 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20   is made to use 
21410 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79  an invalid dirty
21420 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a   list..      */.
21430 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f        goto sync_
21440 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
21450 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
21460 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
21470 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Cache);..    /* 
21480 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
21490 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
214a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
214b0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
214c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
214d0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
214e0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
214f0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
21500 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
21510 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
21520 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
21530 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
21540 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
21550 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
21560 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
21570 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
21580 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21590 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
215a0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
215b0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 73  >dbSize);.  }..s
215c0 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  ync_exit:.  if( 
215d0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
215e0 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  _BLOCKED ){.    
215f0 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  /* pager_incr_ch
21600 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61  angecounter() ma
21610 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  y attempt to obt
21620 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
21630 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20  .     * lock to 
21640 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
21650 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52  and return IOERR
21660 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69  _BLOCKED. But si
21670 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72  nce .     * ther
21680 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
21690 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f  he cache is inco
216a0 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a  nsistent, it is.
216b0 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f       * better to
216c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
216d0 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  USY..     */.   
216e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
216f0 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  Y;.  }.  return 
21700 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
21710 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
21720 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21730 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
21740 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
21750 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
21760 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
21770 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
21780 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
21790 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
217a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
217b0 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
217c0 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
217d0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
217e0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
217f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
21800 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
21810 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
21820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
21830 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
21840 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
21850 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
21860 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
21870 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
21880 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
21890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
218a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
218b0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
218c0 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ed==0 &&.       
218d0 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
218e0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
218f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
21900 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ||.          pPa
21910 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
21920 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73  de!=0) ){.    as
21930 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
21940 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
21950 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21960 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  en==0 );.    ret
21970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21980 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 32   }.  PAGERTRACE2
21990 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
219a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
219b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
219c0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
219d0 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42  _SYNCED || MEMDB
219e0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
219f0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
21a00 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
21a10 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
21a20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
21a30 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
21a40 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
21a50 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
21a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
21a70 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
21a80 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
21a90 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
21aa0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
21ab0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
21ac0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
21ad0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
21ae0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
21af0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
21b00 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
21b10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21b20 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
21b30 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
21b40 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
21b50 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
21b60 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
21b70 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
21b80 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
21b90 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
21ba0 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
21bb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21bc0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
21bd0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
21be0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
21bf0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
21c00 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
21c10 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
21c20 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
21c30 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
21c40 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
21c50 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
21c60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21c80 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
21c90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21cb0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52    PAGERTRACE2("R
21cc0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
21cd0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
21ce0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
21cf0 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
21d00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21d10 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
21d20 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
21d30 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
21d40 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
21d50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
21d60 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
21d70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
21d80 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
21d90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21da0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
21db0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
21dc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
21dd0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
21de0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
21df0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
21e00 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
21e10 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
21e20 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
21e30 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
21e40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21e50 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
21e60 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
21e70 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
21e80 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
21e90 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
21ea0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21ec0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
21ed0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21ee0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21ef0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
21f00 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
21f10 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
21f20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
21f30 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
21f40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
21f50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
21f60 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
21f70 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
21f80 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
21f90 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
21fa0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
21fb0 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
21fc0 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
21fd0 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
21fe0 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
21ff0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
22000 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
22010 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
22020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22030 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
22040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22050 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
22060 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
22070 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
22080 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
22090 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
220a0 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
220b0 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
220c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
220d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
220e0 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
220f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
22100 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
22110 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
22120 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22130 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
22140 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
22150 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
22160 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
22170 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
22180 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
22190 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
221a0 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
221b0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
221c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
221d0 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
221e0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
221f0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
22200 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
22210 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
22220 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
22230 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22240 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
22250 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22260 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
22270 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
22280 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22290 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
222a0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
222b0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
222c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
222d0 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
222e0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
222f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22300 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
22310 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
22320 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
22330 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
22340 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
22350 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
22360 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
22370 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
22380 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
22390 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
223a0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
223b0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
223c0 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
223d0 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
223e0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
223f0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
22400 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
22410 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
22420 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
22430 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
22440 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
22450 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
22460 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
22470 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e  urn MEMDB;.}.#en
22480 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  dif../*.** Ensur
22490 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  e that there are
224a0 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70   at least nSavep
224b0 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20  oint savepoints 
224c0 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
224d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
224e0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
224f0 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
22500 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
22510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22520 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 70  if( nSavepoint>p
22530 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
22540 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
22550 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
22560 6e 74 20 69 69 3b 0a 20 20 20 20 50 61 67 65 72  nt ii;.    Pager
22570 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b  Savepoint *aNew;
22580 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  ..    /* Either 
22590 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
225a0 69 73 20 6f 70 65 6e 20 6f 72 20 74 68 65 72 65  is open or there
225b0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
225c0 61 76 65 70 6f 69 6e 74 73 2e 20 2a 2f 0a 20 20  avepoints. */.  
225d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
225e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
225f0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d  || pPager->sjfd-
22600 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 0a 20 20  >pMethods );..  
22610 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61    /* Grow the Pa
22620 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
22630 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c  rray using reall
22640 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  oc(). Return SQL
22650 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a  ITE_NOMEM.    **
22660 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   if the allocati
22670 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77  on fails. Otherw
22680 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65  ise, zero the ne
22690 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73  w portion in cas
226a0 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c  e a .    ** mall
226b0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
226c0 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69  s while populati
226d0 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72  ng it in the for
226e0 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77  (...) loop below
226f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65  ..    */.    aNe
22700 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f  w = (PagerSavepo
22710 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61  int *)sqlite3Rea
22720 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50  lloc(.        pP
22730 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
22740 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  , sizeof(PagerSa
22750 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f  vepoint)*nSavepo
22760 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  int.    );.    i
22770 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
22780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22790 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
227a0 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 50   memset(&aNew[pP
227b0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
227c0 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 28 6e  ], 0,.        (n
227d0 53 61 76 65 70 6f 69 6e 74 20 2d 20 70 50 61 67  Savepoint - pPag
227e0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  er->nSavepoint) 
227f0 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
22800 76 65 70 6f 69 6e 74 29 0a 20 20 20 20 29 3b 0a  vepoint).    );.
22810 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
22820 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
22830 20 20 20 69 69 20 3d 20 70 50 61 67 65 72 2d 3e     ii = pPager->
22840 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
22850 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
22860 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b  nt = nSavepoint;
22870 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
22880 65 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  e the PagerSavep
22890 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20  oint structures 
228a0 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20  just allocated. 
228b0 2a 2f 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f  */.    for(/* no
228c0 2d 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53 61 76 65  -op */; ii<nSave
228d0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
228e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
228f0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
22900 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  );.      aNew[ii
22910 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72  ].nOrig = pPager
22920 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
22930 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
22940 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
22950 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
22960 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
22970 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
22980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
229a0 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
229b0 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
229c0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
229d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
229e0 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
229f0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
22a00 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  Rec;.      aNew[
22a10 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
22a20 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
22a30 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
22a40 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  bSize);.      if
22a50 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
22a60 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
22a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22a80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
22a90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
22aa0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
22ab0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  nal, if it is no
22ac0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  t already opened
22ad0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70  . */.    rc = op
22ae0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
22af0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
22b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22b10 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73   Parameter op is
22b20 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53   always either S
22b30 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22b40 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  K or SAVEPOINT_R
22b50 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74  ELEASE..** If it
22b60 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
22b70 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65  LEASE, then rele
22b80 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ase and destroy 
22b90 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69  the savepoint wi
22ba0 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76  th.** index iSav
22bb0 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73  epoint. If it is
22bc0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
22bd0 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61  ACK, then rollba
22be0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a  ck all changes.*
22bf0 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75  * that have occu
22c00 72 65 64 20 73 69 6e 63 65 20 73 61 76 65 70 6f  red since savepo
22c10 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 77  int iSavepoint w
22c20 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  as created..**.*
22c30 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
22c40 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  , all savepoints
22c50 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67   with an index g
22c60 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61 76  reater than iSav
22c70 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64  epoint .** are d
22c80 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
22c90 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  If there are les
22ca0 73 20 74 68 61 6e 20 28 69 53 61 76 65 70 6f 69  s than (iSavepoi
22cb0 6e 74 2b 31 29 20 61 63 74 69 76 65 20 73 61 76  nt+1) active sav
22cc0 65 70 6f 69 6e 74 73 20 77 68 65 6e 20 74 68 69  epoints when thi
22cd0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
22ce0 73 20 63 61 6c 6c 65 64 20 69 74 20 69 73 20 61  s called it is a
22cf0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69 6e 74 20   no-op..*/ .int 
22d00 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
22d10 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
22d20 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ger, int op, int
22d30 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22d40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22d50 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f  OK;..  assert( o
22d60 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
22d70 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
22d80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
22d90 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f  ;..  if( iSavepo
22da0 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  int<pPager->nSav
22db0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e  epoint ){.    in
22dc0 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4e  t ii;.    int nN
22dd0 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
22de0 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
22df0 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
22e00 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c  for(ii=nNew; ii<
22e10 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
22e20 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
22e30 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
22e40 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
22e50 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
22e60 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
22e70 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  }.    pPager->nS
22e80 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b  avepoint = nNew;
22e90 0a 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  ..    if( op==SA
22ea0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
22eb0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   && pPager->jfd-
22ec0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
22ed0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
22ee0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  t *pSavepoint = 
22ef0 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61  (nNew==0)?0:&pPa
22f00 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
22f10 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72  nNew-1];.      r
22f20 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63  c = pagerPlaybac
22f30 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  kSavepoint(pPage
22f40 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r, pSavepoint);.
22f50 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21        assert(rc!
22f60 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20  =SQLITE_DONE);. 
22f70 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
22f80 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
22f90 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ase of the outer
22fa0 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20  most savepoint, 
22fb0 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a  truncate .    **
22fc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
22fd0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
22fe0 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
22ff0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
23000 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70   pPager->sjfd->p
23010 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
23020 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
23030 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
23040 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
23050 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
23060 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  jfd, 0);.      p
23070 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
23080 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
23090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
230a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
230b0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
230c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
230d0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
230e0 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
230f0 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
23100 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
23110 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
23120 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
23130 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
23140 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
23150 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
23160 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
23170 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
23180 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23190 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
231a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
231b0 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
231c0 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
231d0 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
231e0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
231f0 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
23200 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
23210 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
23220 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
23230 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
23240 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
23250 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
23260 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
23270 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
23280 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
23290 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
232a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
232b0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
232c0 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
232d0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
232e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
232f0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
23300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23310 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
23320 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
23330 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
23340 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
23350 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
23360 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23370 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23380 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
23390 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
233a0 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
233b0 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
233c0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
233d0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
233e0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
233f0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
23400 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23410 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
23420 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23430 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
23440 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
23450 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
23460 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
23470 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
23480 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
23490 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
234a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
234b0 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
234c0 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
234d0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
234e0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
234f0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
23500 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
23510 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
23520 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
23530 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
23540 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23550 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
23560 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
23570 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
23580 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
23590 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
235a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
235b0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
235c0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
235d0 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
235e0 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
235f0 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
23600 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
23610 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
23620 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
23630 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
23640 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
23650 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
23660 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
23670 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
23680 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
23690 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
236a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
236b0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
236c0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
236d0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
236e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
236f0 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
23700 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
23710 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
23720 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
23730 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
23740 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
23750 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
23760 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
23770 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
23780 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
23790 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
237a0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
237b0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
237c0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
237d0 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
237e0 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
237f0 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
23800 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
23810 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
23820 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
23830 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
23840 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
23850 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
23860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
23870 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
23880 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
23890 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
238a0 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
238b0 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
238c0 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
238d0 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
238e0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
238f0 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
23900 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
23910 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
23920 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
23930 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
23940 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
23950 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
23960 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
23970 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
23980 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
23990 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
239a0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
239b0 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
239c0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
239d0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
239e0 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
239f0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
23a00 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
23a10 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
23a20 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
23a30 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
23a40 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
23a50 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
23a60 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
23a70 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
23a80 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
23a90 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23aa0 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
23ab0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
23ac0 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a  NC)?1:0, pgno);.
23ad0 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
23ae0 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
23af0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
23b00 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
23b10 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
23b20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
23b30 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
23b40 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
23b50 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
23b60 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
23b70 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
23b80 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
23b90 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
23ba0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
23bb0 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
23bc0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
23bd0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
23be0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
23bf0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
23c00 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
23c10 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
23c20 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
23c30 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
23c40 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
23c50 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
23c60 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
23c70 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
23c80 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
23c90 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
23ca0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
23cb0 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
23cc0 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
23cd0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
23ce0 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
23cf0 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
23d00 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
23d10 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
23d20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
23d30 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
23d40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23d50 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
23d60 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
23d70 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
23d80 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
23d90 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
23da0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
23db0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
23dc0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
23dd0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
23de0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
23df0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
23e00 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
23e10 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
23e20 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
23e30 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
23e40 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
23e50 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
23e60 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
23e70 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
23e80 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
23e90 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
23ea0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
23eb0 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
23ec0 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
23ed0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
23ee0 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
23ef0 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
23f00 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a  NEED_SYNC);.  }.
23f10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
23f20 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b  Move(pPg, pgno);
23f30 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
23f40 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
23f50 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a  heDrop(pPgOld);.
23f60 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63    }..  sqlite3Pc
23f70 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
23f80 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69  g);.  pPager->di
23f90 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
23fa0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
23fb0 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  ed = 1;..  if( n
23fc0 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
23fd0 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
23fe0 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
23ff0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
24000 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
24010 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
24020 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
24030 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
24040 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
24050 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
24060 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
24070 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
24080 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
24090 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
240a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73   the .    ** "is
240b0 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76   journaled" bitv
240c0 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  ec flag has been
240d0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
240e0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
240f0 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e  by.    ** loadin
24100 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
24110 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
24120 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
24130 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a  PgHdr.needSync .
24140 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20      ** flag..   
24150 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
24160 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
24170 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
24180 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
24190 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
241a0 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
241b0 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
241c0 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
241d0 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
241e0 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
241f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
24200 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
24210 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
24220 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
24230 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
24240 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
24250 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24260 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
24270 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
24280 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
24290 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
242a0 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
242b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
242c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
242d0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
242e0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
242f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
24300 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
24310 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
24320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
24330 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
24340 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
24350 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
24360 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
24370 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
24380 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
24390 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
243a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
243b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
243c0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
243d0 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
243e0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
243f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24400 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
24410 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
24420 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e  l && needSyncPgn
24430 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
24440 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
24450 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
24460 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
24470 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
24480 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Pgno);.      }. 
24490 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
244a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
244b0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
244c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
244d0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
244e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
244f0 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
24500 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
24510 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
24520 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
24530 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
24540 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
24550 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
24560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
24570 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
24580 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24590 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
245a0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
245b0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
245c0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
245d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
245e0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
245f0 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  >0 || pPg->pPage
24600 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65  r->memDb );.  re
24610 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b  turn pPg->pData;
24620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24630 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24640 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
24650 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
24660 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
24670 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
24680 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
24690 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
246a0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
246b0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
246c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
246d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
246e0 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70  return (pPager?p
246f0 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d  Pg->pExtra:0);.}
24700 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
24710 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
24720 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
24730 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
24740 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
24750 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
24760 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
24770 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
24780 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
24790 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
247a0 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
247b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
247c0 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
247d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
247e0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
247f0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
24800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
24810 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
24820 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
24830 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
24840 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
24850 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
24860 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
24870 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
24880 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
24890 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
248a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
248b0 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
248c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
248d0 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
248e0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
248f0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
24900 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
24910 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
24920 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
24930 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
24940 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
24950 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
24960 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
24970 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
24980 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
24990 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
249a0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
249b0 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
249c0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
249d0 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
249e0 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
249f0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
24a00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
24a10 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
24a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24a30 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
24a40 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  usiveMode;.}../*
24a50 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
24a60 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
24a70 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
24a80 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
24a90 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  t be one of:.**.
24aa0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
24ab0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a  NALMODE_QUERY.**
24ac0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
24ad0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
24ae0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
24af0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
24b00 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
24b10 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
24b20 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
24b30 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20  LMODE_OFF.**.** 
24b40 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
24b50 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
24b60 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
24b70 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
24b80 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65  the.** value spe
24b90 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
24ba0 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63  e returned indic
24bb0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
24bc0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
24bd0 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  d).** journal-mo
24be0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
24bf0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
24c00 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
24c10 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
24c20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
24c30 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
24c40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
24c50 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
24c60 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
24c70 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
24c80 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
24c90 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
24ca0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
24cb0 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
24cc0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
24cd0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
24ce0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
24d00 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
24d10 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
24d20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
24d30 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
24d40 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
24d50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 50 41  ;.    assert( PA
24d60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24d70 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20 20 69  QUERY<0 );.    i
24d80 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20  f( eMode>=0 ){. 
24d90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
24da0 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65  rnalMode = (u8)e
24db0 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Mode;.    }else{
24dc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
24dd0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
24de0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 3b  NALMODE_QUERY );
24df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24e00 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
24e10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
24e20 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
24e30 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
24e40 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
24e50 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
24e60 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50  .*/.i64 sqlite3P
24e70 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
24e80 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
24e90 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b  er, i64 iLimit){
24ea0 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d  .  if( iLimit>=-
24eb0 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 ){.    pPager-
24ec0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
24ed0 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  t = iLimit;.  }.
24ee0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24ef0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
24f00 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  t;.}..#endif /* 
24f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
24f20 49 4f 20 2a 2f 0a                                IO */.