/ Hex Artifact Content
Login

Artifact e82987578519a149e8bdf7f5c2a330d879914b4e:


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: 38 20 32 30 30 39 2f 30 31 2f 30 32 20 32 31 3a  8 2009/01/02 21:
0360: 33 39 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  39:39 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 20 20 50 61 67 65  object */.  Page
30a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
30b0: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
30c0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
30d0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
30e0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
30f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3100: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
3110: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
3120: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
3130: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
3140: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
3150: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
3160: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
3170: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
3180: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
3190: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
31a0: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
31b0: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
31c0: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
31d0: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
31e0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
31f0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3200: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
3210: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3220: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
3230: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
3240: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
3250: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
3260: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
3270: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
3280: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
3290: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
32a0: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
32b0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
32c0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
32d0: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
32e0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
32f0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
3300: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3310: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
3320: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
3330: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
3340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3350: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
3360: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
3370: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
3380: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
3390: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
33a0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
33b0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
33c0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
33d0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
33e0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
33f0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
3400: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
3410: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
3420: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
3430: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
3440: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
3450: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
3460: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
3470: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
3480: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
3490: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
34a0: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
34b0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
34c0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
34d0: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
34e0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
34f0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
3500: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
3510: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
3520: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
3530: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
3540: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
3550: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
3560: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
3570: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
3580: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3590: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
35a0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
35b0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
35c0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
35d0: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
35e0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
35f0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
3600: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
3610: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
3620: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
3630: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
3640: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
3650: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
3660: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
3670: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
3680: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3690: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
36a0: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
36b0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
36c0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
36d0: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
36e0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
36f0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3700: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3710: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3720: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
3730: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
3740: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3750: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
3760: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
3770: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
3780: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
3790: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
37a0: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
37b0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
37c0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
37d0: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
37e0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
37f0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
3800: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
3810: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
3820: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
3830: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
3840: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3850: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
3860: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
3870: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
3880: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
3890: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
38a0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
38b0: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
38c0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
38d0: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
38e0: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
38f0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
3900: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3910: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
3920: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
3930: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
3940: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
3950: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
3960: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
3970: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
3980: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
3990: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
39a0: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
39b0: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
39c0: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
39d0: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
39e0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
39f0: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
3a00: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
3a10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
3a20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
3a30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
3a40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
3a50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
3a60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
3a70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
3a80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
3a90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
3aa0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
3ab0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
3ac0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
3ad0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
3ae0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
3af0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
3b00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
3b10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
3b20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
3b30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
3b40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
3b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
3b60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
3b70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
3b80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
3b90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
3ba0: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
3bb0: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
3bc0: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
3bd0: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
3be0: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
3bf0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
3c00: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
3c10: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
3c20: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
3c30: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
3c40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
3c50: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
3c60: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
3c70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
3c80: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
3c90: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
3ca0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
3cb0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3cc0: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
3cd0: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
3ce0: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
3cf0: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
3d00: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
3d10: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
3d20: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
3d30: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
3d40: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3d50: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
3d60: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
3d70: 28 50 67 6e 6f 29 28 28 50 45 4e 44 49 4e 47 5f  (Pgno)((PENDING_
3d80: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
3d90: 69 7a 65 29 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a  ize))+1))../*.**
3da0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
3db0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
3dc0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
3dd0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
3de0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
3df0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  47../*.** Return
3e00: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
3e10: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
3e20: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
3e30: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
3e40: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
3e50: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
3e60: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
3e70: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
3e80: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
3e90: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
3ea0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
3ec0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
3ed0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
3ee0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
3ef0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
3f00: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
3f10: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
3f20: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
3f30: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
3f40: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
3f50: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
3f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
3f70: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
3f80: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
3f90: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
3fa0: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
3fb0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
3fc0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
3fd0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
3fe0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
3ff0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
4000: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
4010: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
4020: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
4030: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
4040: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4050: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
4060: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
4070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
4080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
40a0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
40b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
40c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
40d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
40e0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
40f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
4100: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
4110: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
4120: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
4130: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
4140: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4150: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4160: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4170: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
4180: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
4190: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
41a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
41b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
41c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
41d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
41e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
41f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
4200: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
4210: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
4220: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4240: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
4250: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
4260: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
4270: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4280: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
4290: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
42a0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
42b0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
42c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
42d0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
42e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
42f0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
4300: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4310: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4320: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
4330: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4340: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4350: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
4360: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
4370: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
4380: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
4390: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
43a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
43b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
43c0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
43e0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
43f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4400: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4410: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
4420: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
4430: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4440: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4450: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
4460: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
4470: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
4480: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
4490: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
44a0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
44b0: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
44c0: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
44d0: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
44e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
44f0: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
4500: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
4510: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
4520: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
4530: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4540: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
4550: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
4560: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
4570: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4580: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
4590: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
45a0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
45b0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
45c0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
45d0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
45e0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
45f0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
4600: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
4610: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
4620: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
4630: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
4640: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
4650: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
4660: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
4670: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
4680: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
4690: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
46a0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
46b0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
46c0: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
46d0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
46e0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
46f0: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
4700: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
4710: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
4720: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
4730: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
4740: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
4750: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4760: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
4770: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
4780: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
4790: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
47a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
47b0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
47c0: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
47d0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
47e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
47f0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
4800: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
4810: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
4820: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
4830: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
4840: 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  */.  int szPage;
4850: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
4860: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
4870: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
4880: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
4890: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
48a0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
48b0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
48c0: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
48d0: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
48e0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
48f0: 64 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  d);.    szPage =
4900: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
4910: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
4920: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
4930: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
4940: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
4950: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
4960: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
4970: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
4980: 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20  ethods || .     
4990: 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f    (dc & (SQLITE_
49a0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
49b0: 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65  Page>>8)) && nSe
49c0: 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b  ctor<=szPage) ){
49d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
49e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
49f0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
4a00: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
4a10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4a20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
4a30: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
4a40: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
4a50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
4a60: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
4a70: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
4a80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
4a90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4aa0: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
4ab0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
4ac0: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
4ad0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
4ae0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
4af0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
4b00: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
4b10: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
4b20: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4b30: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
4b40: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
4b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4b60: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
4b70: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
4b80: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
4b90: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
4ba0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
4bb0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
4bc0: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
4bd0: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
4be0: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
4bf0: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
4c00: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
4c10: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4c20: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
4c30: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
4c40: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
4c50: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
4c60: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
4c70: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
4c80: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
4c90: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
4ca0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
4cb0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
4cc0: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
4cd0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4ce0: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
4cf0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
4d00: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
4d10: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
4d20: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
4d30: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
4d40: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
4d50: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
4d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4d70: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
4d80: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
4d90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4da0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4db0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4dc0: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4dd0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
4de0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
4df0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4e00: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
4e10: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4e20: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
4e30: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
4e40: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
4e50: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
4e60: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
4e70: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4e80: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4e90: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4ea0: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
4eb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
4ec0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
4ed0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4ee0: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
4ef0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
4f00: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
4f10: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
4f20: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
4f30: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
4f40: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
4f50: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
4f60: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
4f70: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
4f80: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
4f90: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
4fa0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
4fb0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
4fc0: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
4fd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
4fe0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
4ff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5000: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5010: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
5020: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
5030: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
5040: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
5050: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
5060: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
5070: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5080: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
5090: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
50a0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
50b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
50c0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
50d0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
50e0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
50f0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
5100: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
5110: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
5120: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
5130: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
5140: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
5150: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5160: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
5170: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
5180: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
5190: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
51a0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
51b0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
51c0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
51d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
51e0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
51f0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
5200: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
5210: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
5220: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
5230: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
5240: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
5250: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
5260: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
5270: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
5280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5290: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
52a0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
52b0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
52c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
52d0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
52e0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
52f0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
5300: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5310: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
5320: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
5330: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5340: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5350: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5360: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5370: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5380: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5390: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
53a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
53b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
53c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
53d0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
53e0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
53f0: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
5400: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
5410: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
5420: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
5430: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
5440: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
5450: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
5460: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
5470: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
5480: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
5490: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
54a0: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
54b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
54c0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
54d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
54e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
54f0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
5500: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
5510: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5520: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
5530: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
5540: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
5550: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
5560: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
5570: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
5580: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
5590: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
55a0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
55b0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
55c0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
55d0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
55e0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
55f0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
5600: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
5610: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
5620: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
5630: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5640: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
5650: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5660: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
5670: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
5680: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
5690: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
56a0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
56b0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
56c0: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
56d0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
56e0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
56f0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
5700: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
5710: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
5720: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
5730: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
5740: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5750: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5760: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5770: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5780: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5790: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
57a0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
57b0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
57c0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
57d0: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
57e0: 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75  2 cksum;.  u32 u
57f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5800: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
5810: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
5820: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5830: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
5840: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
5850: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
5860: 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d  */..  zMaster[0]
5870: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d   = '\0';..  rc =
5880: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5890: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
58a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
58b0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
58c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
58d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
58e0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
58f0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5900: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5910: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e  n rc;..  if( len
5920: 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  >=nMaster ){.   
5930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5940: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  K;.  }..  rc = r
5950: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5960: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
5970: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5980: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5990: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
59a0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
59b0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
59c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
59d0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
59e0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
59f0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5a00: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5a10: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5a20: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
5a30: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
5a40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5a50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
5a60: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  n rc;.  }.  zMas
5a70: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
5a80: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
5a90: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
5aa0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
5ab0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
5ac0: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
5ad0: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
5ae0: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
5af0: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5b00: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5b10: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5b20: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5b30: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5b40: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5b50: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
5b60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5b70: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
5b80: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
5b90: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
5ba0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
5bb0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5bc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5bd0: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5be0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5bf0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5c00: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
5c10: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  r[0] = '\0';.  }
5c20: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
5c30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5c40: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
5c50: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
5c60: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
5c70: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
5c80: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
5c90: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
5ca0: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
5cb0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
5cc0: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5cd0: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5ce0: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5cf0: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5d00: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5d10: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
5d30: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 65  .static void see
5e00: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5e10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5e20: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5e30: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5e40: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5e50: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5e60: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5e70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5e80: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5e90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5ea0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5eb0: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5ec0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5ee0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5ef0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5f00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5f10: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5f20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5f30: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
5f40: 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65   Write zeros ove
5f50: 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  r the header of 
5f60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5f70: 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
5f80: 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76  ** effect of inv
5f90: 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f  alidating the jo
5fa0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63  urnal file and c
5fb0: 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a  ommitting the.**
5fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
5fd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
5fe0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5ff0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
6000: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
6010: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6020: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6030: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6040: 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70   = {0};..  if( p
6050: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6060: 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69  f ){.    i64 iLi
6070: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
6080: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
6090: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
60a0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
60b0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
60c0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
60d0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
60e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
60f0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6100: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
6110: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
6120: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6130: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
6140: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
6150: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
6160: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6170: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
6180: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
6190: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
61a0: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
61b0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
61c0: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
61d0: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
61e0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
61f0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
6200: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6210: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
6220: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
6230: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
6240: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
6250: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
6260: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
6270: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
6280: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
6290: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
62a0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
62b0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
62c0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
62d0: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
62e0: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
62f0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
6300: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
6310: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
6320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
6330: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
6340: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
6350: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
6360: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
6370: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
6380: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
6390: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
63a0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
63b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
63c0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
63d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
63e0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
63f0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
6400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
6440: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
6450: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6460: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
6470: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
6480: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
6490: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
64a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
64b0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
64c0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
64d0: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
64e0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
64f0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
6500: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
6510: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
6520: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
6530: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
6540: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
6550: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
6560: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
6570: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
6580: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
6590: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
65a0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
65b0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
65c0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
65d0: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
65e0: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
65f0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
6600: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
6610: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
6620: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
6630: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
6640: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
6650: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6660: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
6670: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
6680: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
6690: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
66a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
66b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
66c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  ;.  char *zHeade
66d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
66e0: 53 70 61 63 65 3b 0a 20 20 75 33 32 20 6e 48 65  Space;.  u32 nHe
66f0: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
6700: 61 67 65 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  ageSize;.  u32 n
6710: 57 72 69 74 65 3b 0a 20 20 69 6e 74 20 69 69 3b  Write;.  int ii;
6720: 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e  ..  if( nHeader>
6730: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6740: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48  Pager) ){.    nH
6750: 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f  eader = JOURNAL_
6760: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
6770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
6780: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
6790: 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79  vepoints and any
67a0: 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72   of them were cr
67b0: 65 61 74 65 64 20 73 69 6e 63 65 20 74 68 65 0a  eated since the.
67c0: 20 20 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74    ** most recent
67d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
67e0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
67f0: 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76  ate the PagerSav
6800: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 0a 20  epoint.iHdrOff. 
6810: 20 2a 2a 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a   ** fields now..
6820: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
6830: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
6840: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
6850: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
6860: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
6870: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
6880: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
6890: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
68a0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
68b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
68c0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f   }.  }..  seekJo
68d0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
68e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
68f0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
6900: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
6910: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
6920: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6930: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6940: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
6950: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
6960: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
6970: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
6980: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
6990: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
69a0: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
69b0: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
69c0: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
69d0: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
69e0: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
69f0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
6a00: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
6a10: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
6a20: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
6a30: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
6a40: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
6a50: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
6a60: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
6a70: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
6a80: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
6a90: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
6aa0: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
6ab0: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
6ac0: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
6ad0: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
6ae0: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
6af0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6b00: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
6b10: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
6b20: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
6b30: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
6b40: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
6b50: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
6b60: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
6b70: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
6b80: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
6b90: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
6ba0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
6bb0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
6bc0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
6bd0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
6be0: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
6bf0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
6c00: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
6c10: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
6c20: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
6c30: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
6c40: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
6c50: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
6c60: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
6c70: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
6c80: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
6c90: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
6ca0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
6cb0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
6cc0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
6cd0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
6ce0: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
6cf0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
6d00: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
6d10: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
6d20: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
6d30: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
6d40: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
6d50: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
6d60: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
6d70: 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67  noSync) || (pPag
6d80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
6d90: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
6da0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
6db0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
6dc0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
6dd0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
6de0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
6df0: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
6e00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6e10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6e20: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
6e30: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
6e40: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
6e50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6e60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
6e70: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   0);.  }..  /* T
6e80: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
6e90: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
6ea0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
6eb0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
6ec0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
6ed0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
6ee0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
6ef0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6f00: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6f10: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
6f20: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
6f30: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
6f40: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
6f50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6f60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6f70: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
6f80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
6f90: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6fa0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6fb0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6fc0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6fd0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6fe0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6ff0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
7000: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  orSize);..  /* I
7010: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7020: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7030: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7040: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7050: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7060: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7070: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7080: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7090: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
70a0: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
70b0: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
70c0: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
70d0: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
70e0: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
70f0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7100: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7110: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7120: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7130: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7140: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7150: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7160: 29 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  ));..  if( pPage
7170: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30  r->journalHdr==0
7180: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
7190: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
71a0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
71b0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
71c0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
71d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
71e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69  .  }..  for(nWri
71f0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
7200: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
7210: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7220: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
7230: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
7240: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
7250: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
7260: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
7270: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
7280: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7290: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
72a0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
72b0: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
72c0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50  rnalOff);.    pP
72d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
72e0: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
72f0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7300: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
7310: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
7320: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
7330: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
7340: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
7350: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
7360: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
7370: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
7380: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
7390: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
73a0: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
73b0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
73c0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
73d0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
73e0: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
73f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
7400: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
7410: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
7420: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
7430: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
7440: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
7450: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
7460: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
7470: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
7480: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
7490: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
74a0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
74b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
74c0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
74d0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
74e0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
74f0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
7500: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
7510: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
7520: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
7530: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
7540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
7550: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
7560: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
7570: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
7580: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
7590: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
75a0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
75b0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
75c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
75d0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
75e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
75f0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
7600: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
7610: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7620: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
7630: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
7640: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
7650: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
7660: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
7670: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
7680: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
7690: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
76a0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
76b0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
76c0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
76d0: 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67  lOff;.  int iPag
76e0: 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f  eSize;..  seekJo
76f0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
7700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7710: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
7720: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7730: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
7740: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7750: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
7760: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
7770: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
7780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7790: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
77a0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
77b0: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
77c0: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
77d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
77e0: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
77f0: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
7800: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
7810: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7820: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
7830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7840: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
7850: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
7860: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
7870: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
7880: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7890: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
78a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
78b0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
78c0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
78d0: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
78e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
78f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7900: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7910: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
7920: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7930: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
7940: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
7950: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36  >jfd, jrnlOff+16
7960: 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53  , (u32 *)&iPageS
7970: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
7980: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
7990: 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   iPageSize>=512 
79a0: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
79b0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
79c0: 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28  E_SIZE .   && ((
79d0: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
79e0: 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b  geSize)==0 .  ){
79f0: 0a 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a  .    u16 pagesiz
7a00: 65 20 3d 20 28 75 31 36 29 69 50 61 67 65 53 69  e = (u16)iPageSi
7a10: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
7a20: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
7a30: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61  size(pPager, &pa
7a40: 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69  gesize);.  }.  i
7a50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7a60: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
7a70: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
7a80: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
7a90: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
7aa0: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
7ab0: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
7ac0: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
7ad0: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
7ae0: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
7af0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
7b00: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
7b10: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
7b20: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
7b30: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
7b40: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
7b50: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
7b60: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
7b70: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
7b80: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
7b90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
7ba0: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
7bb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7bc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7bd0: 6c 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  lOff+12, &pPager
7be0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
7bf0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7c00: 20 72 63 3b 0a 20 20 69 66 28 20 28 70 50 61 67   rc;.  if( (pPag
7c10: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 26  er->sectorSize &
7c20: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
7c30: 53 69 7a 65 2d 31 29 29 21 3d 30 0a 20 20 20 20  Size-1))!=0.    
7c40: 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
7c50: 73 65 63 74 6f 72 53 69 7a 65 3e 30 78 31 30 30  sectorSize>0x100
7c60: 30 30 30 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0000 ){.    retu
7c70: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7c80: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
7c90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
7ca0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7cb0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
7cc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
7cd0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
7ce0: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
7cf0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
7d00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7d10: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
7d20: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
7d30: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
7d40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7d50: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
7d60: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
7d70: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
7d80: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
7d90: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
7da0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
7db0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
7dc0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
7dd0: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
7de0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
7df0: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
7e00: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
7e10: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
7e20: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
7e30: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
7e40: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
7e50: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
7e60: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
7e70: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
7e80: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
7e90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7ea0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
7eb0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
7ec0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
7ed0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
7ee0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
7ef0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
7f00: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
7f10: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
7f20: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
7f30: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
7f40: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
7f50: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
7f60: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
7f70: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
7f80: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
7f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7fa0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
7fb0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
7fc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
7fd0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
7fe0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
7ff0: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
8000: 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c  lOff;.  i64 jrnl
8010: 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75  Size;.  u32 cksu
8020: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
8030: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
8040: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
8050: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
8060: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
8070: 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ter ) return SQL
8080: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
8090: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
80a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
80b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 20 72 65  MODE_MEMORY ) re
80c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
80d0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
80e0: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
80f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8100: 30 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  0(zMaster);.  fo
8110: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
8120: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
8130: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
8140: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
8150: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
8160: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
8170: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
8180: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
8190: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
81a0: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
81b0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
81c0: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
81d0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
81e0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
81f0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
8200: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
8210: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
8220: 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48      seekJournalH
8230: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
8240: 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67    jrnlOff = pPag
8250: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
8260: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8270: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
8280: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
8290: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
82a0: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45  d, jrnlOff, PAGE
82b0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
82c0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
82d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
82e0: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
82f0: 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 4;..  rc = sql
8300: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
8310: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
8320: 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b  , len, jrnlOff);
8330: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8340: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8350: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c  ;.  jrnlOff += l
8360: 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73  en;..  put32bits
8370: 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70  (zBuf, len);.  p
8380: 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34  ut32bits(&zBuf[4
8390: 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d  ], cksum);.  mem
83a0: 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a  cpy(&zBuf[8], aJ
83b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
83c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
83d0: 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c));.  rc = sqli
83e0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83f0: 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b  r->jfd, zBuf, 8+
8400: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8410: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
8420: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b  .  jrnlOff += 8+
8430: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8440: 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  agic);.  pPager-
8450: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
8460: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
8470: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8480: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
8490: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
84a0: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
84b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
84c0: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
84d0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
84e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
84f0: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
8500: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
8510: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
8520: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
8530: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
8540: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
8550: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
8560: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
8570: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
8580: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
8590: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
85a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
85b0: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
85c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
85d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
85e0: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
85f0: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
8600: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
8610: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
8620: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
8630: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
8640: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
8650: 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d   */ .  if( (rc==
8660: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26  SQLITE_OK).   &&
8670: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
8680: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
8690: 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
86a0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
86b0: 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c  && jrnlSize>jrnl
86c0: 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
86d0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
86e0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
86f0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20   jrnlOff);.  }. 
8700: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8710: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
8720: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
8730: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
8740: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
8750: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
8760: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
8770: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
8780: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
8790: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
87a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
87b0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
87c0: 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 50  r *p;.  sqlite3P
87d0: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
87e0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
87f0: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
8800: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
8810: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
8820: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
8830: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
8840: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8850: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
8860: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
8870: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
8880: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
8890: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
88a0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
88b0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
88c0: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
88d0: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
88e0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
88f0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
8900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8910: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
8920: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
8930: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
8940: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  de ) return;.  s
8950: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
8960: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
8970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  e);.}../*.** Fre
8980: 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  e all structures
8990: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
89a0: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
89b0: 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a   and set both.**
89c0: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
89d0: 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76  t and Pager.nSav
89e0: 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20  epoint to zero. 
89f0: 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f  Close the sub-jo
8a00: 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69  urnal.** if it i
8a10: 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
8a20: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
8a30: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
8a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
8a50: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
8a60: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8a70: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
8a80: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
8a90: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
8aa0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
8ab0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
8ac0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
8ad0: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
8ae0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
8af0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8b00: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  eMode ){.    sql
8b10: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
8b20: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
8b30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
8b40: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
8b50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
8b60: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
8b70: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
8b80: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
8b90: 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 7d  >stmtNRec = 0;.}
8ba0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8bb0: 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
8bc0: 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
8bd0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
8be0: 6e 74 20 62 69 74 76 65 63 73 20 6f 66 0a 2a 2a  nt bitvecs of.**
8bf0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
8c00: 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ints..*/.static 
8c10: 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
8c20: 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
8c30: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
8c40: 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
8c80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
8c90: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
8ca0: 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
8cb0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
8cc0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
8cd0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
8ce0: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
8cf0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
8d00: 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
8d10: 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
8d20: 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
8d30: 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
8d40: 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
8d50: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8d60: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
8d70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
8d80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8d90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8da0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
8db0: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
8dc0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
8dd0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
8de0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
8df0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
8e00: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
8e10: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
8e20: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
8e30: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
8e40: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
8e50: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
8e60: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
8e70: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
8e80: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
8e90: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
8ea0: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
8eb0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
8ec0: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
8ed0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
8ee0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
8ef0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
8f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8f10: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
8f20: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
8f30: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
8f40: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
8f50: 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28  t rc = osUnlock(
8f60: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
8f70: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
8f80: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
8f90: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
8fa0: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
8fb0: 20 3d 20 30 3b 0a 20 20 20 20 49 4f 54 52 41 43   = 0;.    IOTRAC
8fc0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
8fd0: 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
8fe0: 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20  /* Always close 
8ff0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9000: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
9010: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
9020: 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  ..    ** Otherwi
9030: 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e  se, another conn
9040: 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
9050: 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
9060: 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c  might.    ** del
9070: 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74  ete the file out
9080: 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
9090: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
90a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
90b0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  en ){.      sqli
90c0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
90d0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
90e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
90f0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  en = 0;.      sq
9100: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
9110: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
9120: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70 50  urnal);.      pP
9130: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
9140: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
9150: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
9160: 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
9170: 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Rollback);.     
9180: 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73   pPager->pAlways
9190: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
91a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50    }..    /* If P
91b0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
91c0: 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
91d0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
91e0: 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
91f0: 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e     ** trusted. N
9200: 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ow that the page
9210: 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  r file is unlock
9220: 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ed, the contents
9230: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
9240: 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
9250: 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72  arded and the er
9260: 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20  ror code safely 
9270: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
9280: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9290: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
92a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
92b0: 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72  OK ) pPager->err
92c0: 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
92d0: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  ;.      pager_re
92e0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
92f0: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
9300: 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  epoint(pPager);.
9310: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9320: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
9330: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9340: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
9350: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
9360: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
9370: 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
9380: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
9390: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
93a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
93b0: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ne = 0;.  }.}../
93c0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
93d0: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
93e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
93f0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
9400: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
9410: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
9420: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
9430: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
9440: 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f  state, .** do no
9450: 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f  t attempt the ro
9460: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
9470: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
9480: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
9490: 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ger *p){.  if( p
94a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
94b0: 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65  E_OK && p->state
94c0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
94d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
94e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
94f0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
9500: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
9510: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
9520: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
9530: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
9540: 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  k(p);.}../*.** T
9550: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
9560: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
9570: 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
9580: 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65  s ended by eithe
9590: 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72  r.** a COMMIT or
95a0: 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a   a ROLLBACK..**.
95b0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
95c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
95d0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
95e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
95f0: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
9600: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
9610: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
9620: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
9630: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65  outine will rele
9640: 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ase.** the datab
9650: 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ase lock and acq
9660: 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c  uires a SHARED l
9670: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
9680: 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74   if that is.** t
9690: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  he appropriate t
96a0: 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c  hing to do.  Rel
96b0: 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c  ease locks usual
96c0: 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ly is appropriat
96d0: 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20  e,.** unless we 
96e0: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
96f0: 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20   access mode or 
9700: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
9710: 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20   .** COMMIT AND 
9720: 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43  BEGIN or ROLLBAC
9730: 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72  K AND BEGIN oper
9740: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
9750: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9760: 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20   either deleted 
9770: 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a  or truncated..**
9780: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
9790: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
97a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
97b0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
97c0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
97d0: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
97e0: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
97f0: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
9800: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
9810: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
9820: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
9830: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9840: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
9850: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
9860: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
9870: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
9880: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9890: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
98a0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
98b0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
98c0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
98d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
98e0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
98f0: 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  lSavepoint(pPage
9900: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
9910: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
9920: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
9930: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9940: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9950: 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
9960: 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  int isMemoryJour
9970: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d  nal = sqlite3IsM
9980: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
9990: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71  ->jfd);.      sq
99a0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
99b0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
99c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
99d0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
99e0: 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75  if( !isMemoryJou
99f0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
9a00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
9a10: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
9a20: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
9a30: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
9a40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9a50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9a70: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
9a80: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
9a90: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
9aa0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9ab0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
9ac0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
9ad0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
9ae0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9af0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
9b00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9b10: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
9b20: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
9b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9b40: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9b50: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
9b60: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
9b70: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
9b80: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
9b90: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
9ba0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
9bb0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9bc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
9bd0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9be0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
9bf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9c00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c30: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
9c40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
9c50: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
9c60: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
9c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
9c80: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
9c90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
9ca0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
9cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9cc0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9cd0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
9ce0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
9cf0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
9d00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
9d10: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
9d20: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
9d30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
9d40: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
9d50: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
9d60: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
9d70: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
9d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
9d90: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
9da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
9db0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
9dc0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
9dd0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
9de0: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
9df0: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
9e00: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
9e10: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
9e20: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9e30: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
9e40: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
9e50: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
9e60: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9e70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9e80: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
9e90: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
9ea0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
9eb0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
9ec0: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
9ed0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
9ee0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
9ef0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
9f00: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
9f10: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9f20: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
9f30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9f40: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
9f50: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
9f60: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
9f70: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
9f80: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
9f90: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
9fa0: 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73  = 0;.  /* lruLis
9fb0: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
9fc0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 69 66  pPager); */.  if
9fd0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
9fe0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
9ff0: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
a000: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
a010: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
a020: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
a030: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
a040: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
a050: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
a060: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
a070: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
a080: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
a090: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
a0a0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
a0b0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
a0c0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
a0d0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
a0e0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
a0f0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
a100: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
a110: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
a120: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
a130: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
a140: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
a150: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
a160: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
a170: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
a180: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
a190: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
a1a0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
a1b0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
a1c0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
a1d0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
a1e0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
a1f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
a200: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
a210: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
a220: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
a230: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
a240: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
a250: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
a260: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
a270: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
a280: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
a290: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
a2a0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
a2b0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
a2c0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
a2d0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
a2e0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
a2f0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
a300: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
a310: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
a320: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
a330: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
a340: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
a350: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
a360: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
a370: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
a380: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
a390: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
a3a0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
a3b0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
a3c0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
a3d0: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
a3e0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
a3f0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
a400: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
a410: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
a420: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
a430: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
a440: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
a450: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
a460: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
a470: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
a480: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
a490: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
a4a0: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
a4b0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a4c0: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
a4d0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
a4e0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
a4f0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
a500: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
a510: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
a520: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
a530: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a540: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
a550: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
a560: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
a570: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
a580: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
a590: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
a5a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
a5b0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
a5c0: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
a5d0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
a5e0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
a5f0: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
a600: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
a610: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
a620: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a630: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74   does not..*/.st
a640: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
a650: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
a660: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
a670: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
a680: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
a690: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
a6a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
a6b0: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
a6c0: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
a6d0: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
a6e0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
a6f0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20 20   i64 offset,    
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a710: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
a720: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
a730: 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e  /.  int isSavepn
a740: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
a750: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
a760: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
a770: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
a780: 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20  pDone           
a790: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
a7a0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
a7b0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
a7c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
a7d0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7f0: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
a800: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
a810: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
a840: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
a850: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
a860: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
a870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a880: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
a890: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
a8a0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
a8b0: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
a8c0: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
a8d0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
a8e0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c   a page */.  sql
a8f0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 20 3d  ite3_file *jfd =
a900: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70   (isMainJrnl ? p
a910: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
a920: 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 0a 20 20 2f  ger->sjfd);..  /
a930: 2a 20 54 68 65 20 74 65 6d 70 20 73 74 6f 72 61  * The temp stora
a940: 67 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  ge must be alloc
a950: 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ated at this poi
a960: 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
a970: 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
a980: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
a990: 20 70 44 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65   pDone );.  asse
a9a0: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
a9b0: 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 0a 0a 20 20   pDone==0 );..  
a9c0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a9d0: 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67  jfd, offset, &pg
a9e0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
a9f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
aa00: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
aa10: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
aa20: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
aa30: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
aa40: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
aa50: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
aa60: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
aa70: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
aa80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
aa90: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
aaa0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
aab0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
aac0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
aad0: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
aae0: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
aaf0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
ab00: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
ab10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
ab20: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
ab30: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
ab40: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
ab50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
ab60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
ab70: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
ab80: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
ab90: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
aba0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
abb0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
abc0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
abd0: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
abe0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
abf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ac00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
ac10: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
ac20: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
ac30: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
ac40: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
ac50: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ac60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ac70: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
ac80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
ac90: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
aca0: 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  et+pPager->pageS
acb0: 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  ize+4, &cksum);.
acc0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
acd0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
ace0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
acf0: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 21 69 73  = 4;.    if( !is
ad00: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
ad10: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
ad20: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
ad30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad40: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
ad50: 20 20 7d 0a 20 20 69 66 28 20 70 44 6f 6e 65 20    }.  if( pDone 
ad60: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
ad70: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
ad80: 20 70 67 6e 6f 29 29 20 29 7b 0a 20 20 20 20 72   pgno)) ){.    r
ad90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
ada0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
adb0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
adc0: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
add0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
ade0: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
adf0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
ae00: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
ae10: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
ae20: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
ae30: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
ae40: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
ae50: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
ae60: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
ae70: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
ae80: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
ae90: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
aea0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
aeb0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
aec0: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
aed0: 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
aee0: 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
aef0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
af00: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
af10: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
af20: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
af30: 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
af40: 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
af50: 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
af60: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
af70: 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
af80: 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
af90: 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
afa0: 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
afb0: 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
afc0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
afd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
afe0: 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
aff0: 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
b000: 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
b010: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
b020: 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
b030: 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
b040: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
b050: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
b060: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
b070: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
b080: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
b090: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
b0a0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
b0b0: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
b0c0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
b0d0: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
b0e0: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
b0f0: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
b100: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
b110: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
b120: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
b130: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
b140: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
b150: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b160: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
b170: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
b180: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
b190: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
b1a0: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
b1b0: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
b1c0: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
b1d0: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
b1e0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
b1f0: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
b200: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
b210: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
b220: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
b230: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
b240: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
b250: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
b260: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
b270: 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
b280: 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
b290: 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
b2a0: 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
b2b0: 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
b2c0: 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
b2d0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
b2e0: 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
b2f0: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
b300: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
b310: 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
b320: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
b330: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
b340: 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
b350: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
b360: 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
b370: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
b380: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
b390: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
b3a0: 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
b3b0: 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
b3c0: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
b3d0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
b3e0: 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
b3f0: 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
b400: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
b410: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
b420: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
b430: 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
b440: 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
b450: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
b460: 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
b470: 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
b480: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
b490: 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
b4a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
b4b0: 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
b4c0: 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
b4d0: 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
b4e0: 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
b4f0: 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
b500: 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
b510: 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
b520: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
b530: 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
b540: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
b550: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
b560: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45  r, pgno);.  PAGE
b570: 52 54 52 41 43 45 35 28 22 50 4c 41 59 42 41 43  RTRACE5("PLAYBAC
b580: 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
b590: 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
b5b0: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
b5c0: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
b5d0: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
b5e0: 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20  Size, aData),.  
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73               (is
b600: 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
b610: 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
b620: 72 6e 61 6c 22 29 0a 20 20 29 3b 0a 20 20 69 66  rnal").  );.  if
b630: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
b640: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
b650: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
b660: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
b670: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
b680: 4e 43 29 29 0a 20 20 20 26 26 20 28 70 50 61 67  NC)).   && (pPag
b690: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
b6a0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  ).  ){.    i64 o
b6b0: 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  fst = (pgno-1)*(
b6c0: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
b6d0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
b6e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
b6f0: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
b700: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b710: 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
b720: 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
b730: 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
b740: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
b750: 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
b760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
b770: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
b780: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
b790: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
b7a0: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
b7b0: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
b7c0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
b7d0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
b7e0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
b7f0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
b800: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
b810: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
b820: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
b830: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
b840: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
b850: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
b860: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
b870: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
b880: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
b890: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
b8a0: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
b8b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
b8c0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
b8d0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
b8e0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
b8f0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
b900: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
b910: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
b920: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
b930: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
b940: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
b950: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
b960: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
b970: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
b980: 61 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a  alOff<=pPager->j
b990: 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
b9a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
b9b0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
b9c0: 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
b9d0: 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
b9e0: 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
b9f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
ba00: 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
ba10: 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
ba20: 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
ba30: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ba40: 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
ba50: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
ba60: 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
ba70: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
ba80: 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
ba90: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
baa0: 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
bab0: 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20   out to the..   
bac0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
bad0: 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
bae0: 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
baf0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
bb00: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
bb10: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
bb20: 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
bb30: 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
bb40: 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
bb50: 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
bb60: 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
bb70: 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
bb80: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
bb90: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
bba0: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
bbb0: 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
bbc0: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
bbd0: 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
bbe0: 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
bbf0: 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
bc00: 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
bc10: 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
bc20: 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
bc30: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
bc40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bc50: 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
bc60: 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
bc70: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
bc80: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
bc90: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
bca0: 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
bcb0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
bcc0: 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
bcd0: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
bce0: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
bcf0: 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
bd00: 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
bd10: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
bd20: 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
bd30: 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
bd40: 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
bd50: 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
bd60: 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
bd70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
bd80: 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
bd90: 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
bda0: 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
bdb0: 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
bdc0: 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
bdd0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
bde0: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
bdf0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
be00: 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
be10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
be20: 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
be30: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
be40: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
be50: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
be60: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
be70: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
be80: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
be90: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
bea0: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
beb0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
bec0: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
bed0: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
bee0: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
bef0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
bf00: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
bf10: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
bf20: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
bf30: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
bf40: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
bf50: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
bf60: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
bf70: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
bf80: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
bf90: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
bfa0: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
bfb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
bfc0: 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
bfd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bfe0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
bff0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
c000: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
c010: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c020: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
c030: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
c040: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
c050: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c060: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
c070: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
c080: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c090: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
c0a0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
c0b0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
c0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
c0d0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
c0e0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
c0f0: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
c100: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
c110: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
c120: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
c130: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
c140: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
c150: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
c160: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
c170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
c180: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
c190: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
c1a0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
c1b0: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
c1c0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
c1d0: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
c1e0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
c1f0: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
c200: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
c210: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
c220: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
c230: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
c240: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
c250: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
c260: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
c270: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
c280: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
c290: 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
c2a0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
c2b0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
c2c0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
c2d0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
c2e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
c2f0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
c300: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
c310: 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74  pMaster;.  sqlit
c320: 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
c330: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  l;.  char *zMast
c340: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
c350: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
c360: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c370: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
c380: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
c390: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
c3a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c3b0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
c3c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c3d0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
c3e0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
c3f0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
c400: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
c410: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
c420: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
c430: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
c440: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d  rence..  */.  pM
c450: 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
c460: 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
c470: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
c480: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
c490: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
c4a0: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
c4b0: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
c4c0: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
c4d0: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
c4e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
c4f0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
c500: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
c510: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
c520: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
c530: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
c540: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c550: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
c560: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
c570: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
c580: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c590: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
c5a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
c5b0: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
c5c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
c5d0: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
c5e0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
c5f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c600: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
c610: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
c620: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
c630: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
c640: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
c650: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
c660: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
c670: 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d  terPtr = pPager-
c680: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
c690: 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
c6a0: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
c6b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c6c0: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
c6d0: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
c6e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
c6f0: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
c700: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
c710: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
c720: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
c730: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
c740: 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
c750: 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
c760: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66  sterPtr);.    if
c770: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
c780: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
c790: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c7a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
c7b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
c7c0: 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
c7d0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
c7e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a  MasterJournal];.
c7f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c800: 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
c810: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
c820: 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
c830: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
c840: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c850: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
c860: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
c870: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
c880: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
c890: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
c8a0: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
c8b0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
c8c0: 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
c8d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c8e0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
c8f0: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
c900: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
c910: 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69  exists);.      i
c920: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c930: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c940: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
c950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c960: 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
c970: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
c980: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
c990: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
c9a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
c9b0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
c9c0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
c9d0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
c9e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c9f0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
ca00: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
ca10: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
ca20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ca30: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
ca40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
ca50: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
ca60: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
ca70: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
ca80: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
ca90: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
caa0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
cab0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
cac0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
cad0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
cae0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
caf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
cb00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
cb10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
cb20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
cb30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
cb40: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
cb50: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
cb60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
cb70: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
cb80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
cb90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cba0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
cbb0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
cbc0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
cbd0: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
cbe0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
cbf0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
cc00: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
cc10: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
cc20: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
cc30: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
cc40: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
cc50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
cc60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
cc70: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
cc80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cc90: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
cca0: 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
ccb0: 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
ccc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
ccd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
cce0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
ccf0: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
cd00: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
cd10: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
cd20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cd30: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
cd40: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
cd50: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
cd60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cd70: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
cd80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
cd90: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
cda0: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
cdb0: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
cdc0: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
cdd0: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
cde0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
cdf0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
ce00: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
ce10: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ce20: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
ce30: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
ce40: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
ce50: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
ce60: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20  le..**.** Might 
ce70: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
ce80: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
ce90: 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
cea0: 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a  er than nPage..*
ceb0: 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  * This can happe
cec0: 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
ced0: 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65  if we are in the
cee0: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61   middle of a tra
cef0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  nsaction.** whic
cf00: 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74  h has extended t
cf10: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  he file size and
cf20: 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61   the new pages a
cf30: 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c  re still all hel
cf40: 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74  d.** in cache, t
cf50: 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  hen an INSERT or
cf60: 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73   UPDATE does a s
cf70: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
cf80: 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72  k.  Some.** oper
cf90: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
cfa0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
cfb0: 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
cfc0: 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74   you try to.** t
cfd0: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
cfe0: 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
cff0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d000: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  it currently is,
d010: 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68  .** so detect th
d020: 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
d030: 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
d040: 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
d050: 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69  of the new.** fi
d060: 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73  le instead..*/.s
d070: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
d080: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
d090: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
d0a0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
d0b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
d0c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d0d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
d0e0: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
d0f0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
d100: 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
d110: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  newSize;.    rc 
d120: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d130: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
d140: 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
d150: 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61     newSize = pPa
d160: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
d170: 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
d180: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d190: 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
d1a0: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
d1b0: 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
d1c0: 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
d1d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d1e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d1f0: 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
d200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d210: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d220: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
d230: 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77  ->fd, "", 1, new
d240: 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Size-1);.      }
d250: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d260: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d270: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
d280: 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
d290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d2a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
d2b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
d2c0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
d2d0: 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
d2e0: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
d2f0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
d300: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d310: 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53   Set the sectorS
d320: 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ize for the give
d330: 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  n pager..**.** T
d340: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
d350: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69  s at least as bi
d360: 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20  g as the sector 
d370: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
d380: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
d390: 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20  torSize().  The 
d3a0: 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73  minimum sector s
d3b0: 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73  ize is 512..*/.s
d3c0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
d3d0: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
d3e0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
d3f0: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
d400: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
d410: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
d420: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
d430: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
d440: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
d450: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
d460: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
d470: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
d480: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
d490: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
d4a0: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
d4b0: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
d4c0: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
d4d0: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
d4e0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
d4f0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
d500: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
d510: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
d520: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
d530: 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
d540: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
d550: 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
d560: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
d570: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
d580: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
d590: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
d5a0: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
d5b0: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
d5c0: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
d5d0: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
d5e0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
d5f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
d600: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
d610: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
d620: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
d630: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
d640: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
d650: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
d660: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
d670: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
d680: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
d690: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
d6a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
d6b0: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
d6c0: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
d6d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
d6e0: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
d6f0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
d700: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
d710: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
d720: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
d730: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
d740: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
d750: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
d760: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
d770: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
d780: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
d790: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
d7a0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
d7b0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
d7c0: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
d7d0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
d7e0: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
d7f0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
d800: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
d810: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
d820: 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
d830: 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
d840: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
d850: 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
d860: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
d870: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
d880: 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
d890: 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
d8a0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
d8b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
d8c0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
d8d0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
d8e0: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
d8f0: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
d900: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
d910: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
d920: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
d930: 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
d940: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
d950: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
d960: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
d970: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
d980: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
d990: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
d9a0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
d9b0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
d9c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
d9d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
d9e0: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
d9f0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
da00: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
da10: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
da20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
da30: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
da40: 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
da50: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
da60: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
da70: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
da80: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
da90: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
daa0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
dab0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
dac0: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
dad0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
dae0: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
daf0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
db00: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
db10: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
db20: 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
db30: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
db40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
db50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
db60: 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
db70: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
db80: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
db90: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
dba0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
dbb0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
dbc0: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
dbd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
dbe0: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
dbf0: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
dc00: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
dc10: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
dc20: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
dc30: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
dc40: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
dc50: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
dc60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
dc70: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
dc80: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
dc90: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
dca0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
dcb0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
dcc0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
dcd0: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
dce0: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
dcf0: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
dd00: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
dd10: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
dd20: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
dd30: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
dd40: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
dd50: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
dd60: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
dd70: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
dd80: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
dd90: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
dda0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
ddb0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
ddc0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
ddd0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
dde0: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
ddf0: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
de00: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
de10: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
de20: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
de30: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
de40: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
de50: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
de60: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
de70: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
de80: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
de90: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
dea0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
deb0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
dec0: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
ded0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
dee0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
def0: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
df00: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
df10: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
df20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
df30: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
df40: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
df50: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
df60: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
df70: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
df80: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
df90: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
dfa0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
dfb0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
dfc0: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
dfd0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
dfe0: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
dff0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
e000: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
e010: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
e020: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
e030: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
e040: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
e050: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
e060: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
e070: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
e080: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
e090: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
e0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e0b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
e0c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
e0d0: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
e0e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
e0f0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
e100: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
e110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e120: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
e130: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
e140: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e160: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
e170: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
e180: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1a0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
e1b0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
e1c0: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
e1d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e1e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
e1f0: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
e200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
e210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
e220: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
e230: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
e240: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
e250: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
e260: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
e270: 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
e280: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
e290: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
e2a0: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
e2b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
e2c0: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
e2d0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
e2e0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
e2f0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
e300: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
e310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
e320: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
e330: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e340: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
e350: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
e360: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
e370: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
e380: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
e390: 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
e3a0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
e3b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
e3c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e3d0: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
e3e0: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
e3f0: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
e400: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
e410: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
e420: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
e430: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
e440: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
e450: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
e460: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
e470: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
e480: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
e490: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
e4a0: 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
e4b0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e4c0: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
e4d0: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
e4e0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
e4f0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
e500: 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
e510: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e520: 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
e530: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e540: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
e550: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
e560: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
e570: 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
e580: 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
e590: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e5a0: 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
e5b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
e5c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
e5d0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
e5e0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
e5f0: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
e600: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
e610: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
e620: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
e630: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
e640: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
e650: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
e660: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
e670: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
e680: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
e690: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
e6a0: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
e6b0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
e6c0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
e6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
e6e0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
e6f0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
e700: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
e710: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
e720: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
e730: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
e740: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
e750: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
e760: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
e770: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
e780: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
e790: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
e7a0: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
e7b0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
e7c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
e7d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e7e0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
e7f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
e800: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
e810: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
e820: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
e830: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
e840: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
e850: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
e860: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
e870: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
e880: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
e890: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
e8a0: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
e8b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e8c0: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
e8d0: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
e8e0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
e8f0: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
e900: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
e910: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
e920: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
e930: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
e940: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
e950: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
e960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e970: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
e980: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e990: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
e9a0: 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
e9b0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
e9c0: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
e9d0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
e9e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e9f0: 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
ea00: 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
ea10: 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
ea20: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
ea30: 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
ea40: 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
ea50: 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
ea60: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
ea70: 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
ea80: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
ea90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
eaa0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
eab0: 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
eac0: 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
ead0: 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
eae0: 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
eaf0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
eb00: 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
eb10: 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
eb20: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
eb30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
eb40: 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
eb50: 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
eb60: 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
eb70: 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20  #2565..    */.  
eb80: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
eb90: 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
eba0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ebb0: 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
ebc0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
ebd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ebe0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
ebf0: 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
ec00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ec10: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
ec20: 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
ec30: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ec40: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
ec50: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
ec60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
ec70: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
ec80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
ec90: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
eca0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
ecb0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ecc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
ecd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ece0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
ecf0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
ed00: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
ed10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ed20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ed30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
ed40: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
ed50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
ed60: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
ed70: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
ed80: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
ed90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
eda0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
edb0: 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
edc0: 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  u++){.      rc =
edd0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
ede0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
edf0: 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   1, pPager->jour
ee00: 6e 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a 20  nalOff, 0, 0);. 
ee10: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ee20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ee30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ee40: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
ee50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ee60: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
ee70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ee80: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
ee90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
eea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
eeb0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
eec0: 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
eed0: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
eee0: 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a  ase is probably.
eef0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69            ** goi
ef00: 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69  ng to end up bei
ef10: 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20  ng corrupt.  It 
ef20: 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73  is corrupt to us
ef30: 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20  , anyhow..      
ef40: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
ef50: 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20  he next process 
ef60: 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61  to come along ca
ef70: 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20  n fix it.....   
ef80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ef90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
efa0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
efb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
efc0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
efd0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
efe0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
eff0: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
f000: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
f010: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
f020: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f030: 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
f040: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
f050: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
f060: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
f070: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
f080: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
f090: 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
f0a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f0b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
f0c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
f0d0: 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
f0e0: 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
f0f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
f100: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
f110: 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
f120: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
f130: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
f140: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
f150: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
f160: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
f170: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
f180: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
f190: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
f1a0: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
f1b0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
f1c0: 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
f1d0: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
f1e0: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
f1f0: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
f200: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
f210: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
f220: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
f230: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
f240: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
f250: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
f260: 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
f270: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
f280: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
f290: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
f2a0: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
f2b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
f2c0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
f2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
f2e0: 61 63 6b 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  ack a savepoint.
f2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
f300: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
f310: 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
f320: 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
f330: 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
f340: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f360: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
f370: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
f380: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
f390: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
f3a0: 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
f3b0: 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
f3c0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f  ecords */.  Pgno
f3d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
f3e0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
f3f0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
f400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f410: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f420: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
f430: 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
f440: 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
f450: 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
f460: 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
f470: 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
f480: 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
f490: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
f4a0: 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
f4b0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
f4c0: 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
f4d0: 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
f4e0: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
f4f0: 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
f500: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
f510: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
f520: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f530: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f540: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
f550: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 74 68  abase back to th
f560: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 62 65  e size it was be
f570: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  fore the .  ** s
f580: 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 72  avepoint being r
f590: 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
f5a0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
f5b0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
f5c0: 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
f5d0: 74 3f 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  t?pSavepoint->nO
f5e0: 72 69 67 3a 70 50 61 67 65 72 2d 3e 64 62 4f 72  rig:pPager->dbOr
f5f0: 69 67 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  igSize);.  asser
f600: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
f610: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
f620: 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  ;..  /* Now roll
f630: 20 62 61 63 6b 20 61 6c 6c 20 6d 61 69 6e 20 6a   back all main j
f640: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 65 63 6f  ournal file reco
f650: 72 64 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  rds that occur a
f660: 66 74 65 72 20 62 79 74 65 0a 20 20 2a 2a 20 62  fter byte.  ** b
f670: 79 74 65 20 6f 66 66 73 65 74 20 50 61 67 65 72  yte offset Pager
f680: 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
f690: 74 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  t that have a pa
f6a0: 67 65 20 6e 75 6d 62 65 72 20 6c 65 73 73 20 74  ge number less t
f6b0: 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
f6c0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
f6d0: 69 6e 74 2e 6e 4f 72 69 67 2e 20 41 73 20 65 61  int.nOrig. As ea
f6e0: 63 68 20 72 65 63 6f 72 64 20 69 73 20 70 6c 61  ch record is pla
f6f0: 79 65 64 20 62 61 63 6b 2c 0a 20 20 2a 2a 20 74  yed back,.  ** t
f700: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
f710: 20 62 69 74 20 69 6e 20 62 69 74 76 65 63 20 50   bit in bitvec P
f720: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
f730: 6e 53 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 20  nSavepoint is . 
f740: 20 2a 2a 20 63 6c 65 61 72 65 64 2e 0a 20 20 2a   ** cleared..  *
f750: 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
f760: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
f770: 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
f780: 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
f790: 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
f7a0: 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
f7b0: 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
f7c0: 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
f7d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
f7e0: 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
f7f0: 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
f800: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f810: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f820: 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
f830: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
f840: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
f850: 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70 50 61  e(pPager, 1, pPa
f860: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
f870: 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
f880: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f890: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f8a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f8b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f8c0: 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68  ff = 0;.  }.  wh
f8d0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f8e0: 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
f8f0: 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
f900: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
f910: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
f920: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
f930: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
f940: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
f950: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
f960: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
f970: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
f980: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f990: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
f9a0: 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
f9b0: 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
f9c0: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
f9d0: 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
f9e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
f9f0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
fa00: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
fa10: 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
fa20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa30: 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
fa40: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
fa50: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
fa60: 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70 50  ge(pPager, 1, pP
fa70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fa80: 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
fa90: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
faa0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
fab0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
fac0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fad0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
fae0: 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff==szJ );.. 
faf0: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62 61 63   /* Now roll bac
fb00: 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
fb10: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
fb20: 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
fb30: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  t ){.    for(ii=
fb40: 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
fb50: 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
fb60: 4f 4b 26 26 69 69 3c 28 75 33 32 29 70 50 61 67  OK&&ii<(u32)pPag
fb70: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 20 69 69  er->stmtNRec; ii
fb80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ++){.      i64 o
fb90: 66 66 73 65 74 20 3d 20 69 69 2a 28 34 2b 70 50  ffset = ii*(4+pP
fba0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
fbb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
fbc0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
fbd0: 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 6f  age(pPager, 0, o
fbe0: 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
fbf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fc00: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
fc10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
fc20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
fc30: 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
fc40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fc50: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
fc60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
fc70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
fc80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
fc90: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
fca0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
fcb0: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
fcc0: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
fcd0: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fce0: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
fcf0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
fd00: 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
fd10: 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
fd20: 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
fd30: 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
fd40: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
fd50: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
fd60: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
fd70: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
fd80: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
fd90: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
fda0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
fdb0: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
fdc0: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
fdd0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
fde0: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
fdf0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
fe00: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
fe10: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
fe20: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
fe30: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
fe40: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
fe50: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
fe60: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
fe70: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
fe80: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
fe90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
fea0: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
feb0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
fec0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
fed0: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
fee0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
fef0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
ff00: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
ff10: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
ff20: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
ff30: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
ff40: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
ff60: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
ff70: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
ff80: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
ff90: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
ffa0: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
ffb0: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
ffc0: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
ffd0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
ffe0: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
fff0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
10000 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
10010 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
10020 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
10030 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
10040 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
10060 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
10070 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
10080 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
10090 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
100a0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
100b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
100c0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
100d0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
100e0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
100f0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
10100 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
10110 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
10120 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
10130 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
10140 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
10150 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
10170 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
10180 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
10190 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
101a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
101b0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
101c0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
101d0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
101e0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
101f0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
10200 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
10210 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
10220 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
10230 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
10240 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
10250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
10260 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
10270 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10280 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
10290 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
102a0 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
102b0 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
102c0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
102d0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
102e0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
102f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10300 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
10310 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
10320 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
10330 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
10340 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
10350 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
10360 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
10370 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10380 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
10390 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
103a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
103b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
103c0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
103d0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
103e0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
103f0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
10400 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
10410 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
10420 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
10430 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
10440 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
10450 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
10460 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
10470 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
10480 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
10490 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
104a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
104b0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
104c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
104d0 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
104e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
104f0 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
10500 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
10510 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
10520 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
10530 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
10540 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
10550 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
10560 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  s closed..*/.sta
10570 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
10580 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
10590 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
105a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
105b0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
105c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
105d0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
105e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
105f0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
10600 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
10610 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
10620 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
10630 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
10640 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
10650 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
10660 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
10670 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
10680 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
10690 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
106a0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
106b0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
106c0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
106d0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
106e0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
106f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
10700 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
10710 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
10720 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10730 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
10740 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
10750 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
10760 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
10770 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
10780 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
10790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
107a0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
107b0 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a  s(void *,PgHdr *
107c0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  );../*.** Create
107d0 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
107e0 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
107f0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
10800 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
10810 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
10820 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
10830 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
10840 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
10850 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
10860 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
10870 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
10880 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
10890 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
108a0 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
108b0 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
108c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
108d0 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
108e0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
108f0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
10900 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
10910 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
10920 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
10930 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
10940 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
10950 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
10960 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
10970 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
10980 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
10990 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
109a0 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
109b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
109c0 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
109d0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
109e0 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
109f0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
10a00 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
10a10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10a20 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
10a30 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
10a40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10a50 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
10a60 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
10a70 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
10a80 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
10a90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10aa0 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
10ab0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
10ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
10ad0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
10ae0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10af0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
10b00 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
10b30 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
10b40 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
10b50 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
10b60 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
10b70 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
10b80 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
10b90 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
10ba0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
10bb0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
10bc0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
10bd0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
10be0 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
10bf0 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
10c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10c10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10c20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
10c30 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
10c40 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
10c50 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
10c60 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
10c70 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
10c80 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
10c90 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
10ca0 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
10cb0 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
10cc0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
10cd0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
10ce0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
10cf0 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73  eSize();.  int s
10d00 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
10d10 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
10d20 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
10d30 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
10d40 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
10d50 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
10d60 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
10d70 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
10d80 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
10d90 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
10da0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
10db0 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d  lSize(pVfs);.  }
10dc0 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
10dd0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
10de0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
10df0 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  e();.  }..  /* T
10e00 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
10e10 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
10e20 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
10e30 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
10e40 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
10e50 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
10e60 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
10e70 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
10e80 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
10e90 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
10ea0 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
10eb0 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
10ec0 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
10ed0 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
10ee0 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
10ef0 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
10f00 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
10f10 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
10f20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
10f30 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
10f40 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
10f50 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
10f60 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
10f70 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
10f80 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
10f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10fa0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  OMEM;.    }.#ifn
10fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10fc0 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
10fd0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
10fe0 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
10ff0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
11000 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  = 1;.      zPath
11010 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  name[0] = 0;.   
11020 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
11030 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73    {.      rc = s
11040 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
11050 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
11060 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
11070 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
11080 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
11090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
110a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
110b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
110c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
110d0 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  }.    nPathname 
110e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
110f0 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
11100 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
11110 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
11120 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
11130 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
11140 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
11150 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
11160 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
11170 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
11180 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68  ure */.    pcach
11190 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20  eSize      +    
111a0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
111b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a   object */.    j
111c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b  ournalFileSize +
111d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
111e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
111f0 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20  tructure */ .   
11200 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
11210 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
11220 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
11230 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
11240 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
11250 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
11260 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
11270 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65  .    3*nPathname
11280 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20 20   + 40           
11290 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a   /* zFilename, z
112a0 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72  Directory, zJour
112b0 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  nal */.  );.  if
112c0 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20  ( !pPager ){.   
112d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
112e0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
112f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11300 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  M;.  }.  pPager-
11310 3e 70 50 43 61 63 68 65 20 3d 20 28 50 43 61 63  >pPCache = (PCac
11320 68 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  he *)&pPager[1];
11330 0a 20 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a  .  pPtr = ((u8 *
11340 29 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70  )&pPager[1]) + p
11350 63 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61  cacheSize;.  pPa
11360 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
11370 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67  vfsFlags;.  pPag
11380 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65  er->fd = (sqlite
11390 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
113a0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b  fs->szOsFile*0];
113b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
113c0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
113d0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
113e0 73 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72  sFile];.  pPager
113f0 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
11400 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
11410 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72  s->szOsFile+jour
11420 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20  nalFileSize];.  
11430 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
11440 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72  e = (char*)&pPtr
11450 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b  [pVfs->szOsFile+
11460 32 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  2*journalFileSiz
11470 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  e];.  pPager->zD
11480 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
11490 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
114a0 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
114b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
114c0 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
114d0 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  tory[nPathname+1
114e0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
114f0 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20  s = pVfs;.  if( 
11500 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
11510 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
11520 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
11530 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
11540 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
11550 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
11560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
11570 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
11580 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
11590 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
115a0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
115b0 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e  {.    if( nPathn
115c0 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74  ame>(pVfs->mxPat
115d0 68 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a  hname - (int)siz
115e0 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  eof("-journal"))
115f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
11600 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
11610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11620 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
11630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11640 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
11650 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
11660 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
11690 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
116a0 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
116b0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
116c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
116d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
116e0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
116f0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
11700 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
11710 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  s,.      ** choo
11720 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
11730 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
11740 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
11750 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
11760 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11770 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
11780 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
11790 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  m of:.      **. 
117a0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c       **    + SQL
117b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
117c0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20  _SIZE,.      ** 
117d0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
117e0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
117f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
11800 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
11810 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
11820 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
11830 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
11840 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lly..      */.  
11850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11860 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
11870 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ly ){.        in
11880 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20  t iSectorSize = 
11890 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
118a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
118b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
118c0 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f 72 53  ageDflt<iSectorS
118d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
118e0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 53   szPageDflt = iS
118f0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
11900 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
11910 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
11920 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
11930 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
11940 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
11950 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11960 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
11970 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
11980 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
11990 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
119a0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
119b0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
119c0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
119d0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
119e0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
119f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
11a00 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
11a10 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
11a20 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
11a30 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
11a40 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
11a50 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
11a60 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
11a70 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
11a80 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
11a90 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
11aa0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
11ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11ac0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11ad0 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
11ae0 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58  eDflt>SQLITE_MAX
11af0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
11b00 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
11b10 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
11b20 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
11b30 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
11b40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11b50 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11b60 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
11b70 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
11b80 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
11b90 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
11ba0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
11bb0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
11bc0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
11bd0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
11be0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
11bf0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
11c00 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
11c10 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
11c20 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
11c30 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
11c40 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
11c50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11c60 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
11c70 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
11c80 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
11c90 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
11ca0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
11cb0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
11cc0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
11cd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
11ce0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
11cf0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
11d00 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
11d10 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
11d20 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
11d30 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20  }..  if( pPager 
11d40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11d50 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11d60 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
11d70 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a  te3PageMalloc(sz
11d80 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a  PageDflt);.  }..
11d90 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
11da0 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
11db0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
11dc0 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
11dd0 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
11de0 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
11df0 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
11e00 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
11e10 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
11e20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
11e30 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
11e40 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
11e50 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
11e60 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
11e70 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
11e80 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
11e90 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11ea0 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
11eb0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
11ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
11ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
11ee0 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
11ef0 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f   }.  nExtra = FO
11f00 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
11f10 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
11f20 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
11f30 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
11f40 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
11f50 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
11f60 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
11f70 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
11f80 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
11f90 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
11fa0 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
11fb0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
11fc0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
11fd0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
11fe0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
11ff0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
12000 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
12010 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
12020 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
12030 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
12040 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
12050 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
12060 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
12070 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
12080 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
12090 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
120a0 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69 3e 30  ory); .      i>0
120b0 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
120c0 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
120d0 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
120e0 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
120f0 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
12100 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
12110 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
12120 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
12130 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ame ){.    memcp
12140 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
12150 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  al, pPager->zFil
12160 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
12170 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
12180 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
12190 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
121a0 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65  urnal", 9);.  }e
121b0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
121c0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  >zJournal = 0;. 
121d0 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   }..  /* pPager-
121e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
121f0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75  ; */.  pPager->u
12200 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
12210 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
12220 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
12230 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
12240 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
12250 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
12260 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
12270 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
12280 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
12290 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
122a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
122b0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
122c0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
122d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
122e0 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f   szPageDflt;.  /
122f0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
12300 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
12310 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
12320 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
12330 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
12340 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
12350 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
12360 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
12370 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
12380 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
12390 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
123a0 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
123b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
123c0 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
123d0 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
123e0 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
123f0 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
12400 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
12410 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
12420 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
12430 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
12440 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
12450 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
12460 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
12470 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
12480 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
12490 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
124a0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
124b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
124c0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
124d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
124e0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
124f0 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
12500 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
12510 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
12520 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
12530 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
12540 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
12550 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
12560 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
12570 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
12580 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  l) ?1:0;.  pPage
12590 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
125a0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
125b0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
125c0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
125d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
125e0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
125f0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
12600 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12610 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
12620 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
12630 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
12640 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61  >nExtra = nExtra
12650 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12660 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
12670 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
12680 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
12690 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
126a0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
126b0 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 65  |tempFile);.  se
126c0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
126d0 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44 62  er);.  if( memDb
126e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
126f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
12700 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12710 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
12720 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
12730 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
12740 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
12750 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
12760 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
12770 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
12780 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
12790 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
127a0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
127b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
127c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
127d0 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
127e0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
127f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
12800 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
12810 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
12820 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  , .  int (*xBusy
12830 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
12840 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  ,.  void *pBusyH
12850 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20 0a 20  andlerArg.){  . 
12860 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
12870 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
12880 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
12890 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
128a0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
128b0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  g;.}../*.** Set 
128c0 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
128d0 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
128e0 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
128f0 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
12900 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
12910 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
12920 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
12930 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
12940 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
12950 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
12960 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
12970 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
12980 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
12990 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
129a0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
129b0 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
129c0 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
129d0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
129e0 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
129f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12a00 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
12a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12a20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
12a30 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61  DbPage*)){.  pPa
12a40 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
12a50 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
12a60 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
12a70 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
12a80 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
12a90 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
12aa0 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
12ab0 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
12ac0 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
12ad0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
12ae0 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
12af0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
12b00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12b10 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
12b20 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
12b30 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
12b40 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
12b50 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72  errCode;.  if( r
12b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12b70 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65      u16 pageSize
12b80 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
12b90 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53     assert( pageS
12ba0 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
12bb0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
12bc0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
12bd0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
12be0 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20     if( pageSize 
12bf0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
12c00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
12c10 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
12c20 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
12c30 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
12c40 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
12c50 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
12c60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
12c70 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
12c80 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
12c90 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
12ca0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
12cb0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
12cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12cd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12cf0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
12d00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12d10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
12d20 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
12d30 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
12d40 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74 53 65  r->memDb ) setSe
12d50 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
12d60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12d70 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
12d80 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
12d90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
12da0 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
12db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
12dc0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
12dd0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
12de0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
12df0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
12e00 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
12e10 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
12e20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
12e30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
12e40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
12e50 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
12e60 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
12e70 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
12e80 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
12e90 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
12ea0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
12eb0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
12ec0 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
12ed0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
12ee0 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
12ef0 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
12f00 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
12f10 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
12f20 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12f30 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
12f40 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
12f50 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
12f60 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
12f70 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
12f80 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
12f90 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
12fa0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
12fb0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
12fc0 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
12fd0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
12fe0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
12ff0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
13000 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
13010 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
13020 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
13030 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
13040 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
13050 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
13060 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
13070 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
13080 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
13090 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
130a0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
130b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
130c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
130d0 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
130e0 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
130f0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
13100 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
13110 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
13120 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
13130 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
13140 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
13150 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
13160 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
13170 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
13180 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13190 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
131a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
131b0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
131c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
131d0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
131e0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
131f0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
13200 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
13210 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
13220 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
13230 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
13240 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
13250 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
13260 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
13270 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
13280 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
13290 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
132a0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
132b0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
132c0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
132d0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
132e0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
132f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
13300 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
13310 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
13320 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
13330 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
13340 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
13350 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13360 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
13370 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
13380 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
13390 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
133a0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
133b0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
133c0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
133d0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
133e0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
133f0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
13400 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
13410 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
13420 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
13430 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
13440 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
13450 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
13460 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
13470 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
13480 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
13490 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
134a0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
134b0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
134c0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
134d0 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
134e0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
134f0 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
13500 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
13510 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
13520 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
13530 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
13540 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
13550 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
13560 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
13570 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
13580 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
13590 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
135a0 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
135b0 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
135c0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
135d0 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
135e0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
135f0 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
13600 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
13610 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
13620 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
13630 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
13640 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
13650 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13660 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
13670 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
13680 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
13690 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
136a0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
136b0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
136c0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
136d0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
136e0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
136f0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
13700 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
13710 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
13720 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
13730 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
13740 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
13750 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
13760 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
13770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
13780 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
13790 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
137a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
137b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
137c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
137d0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
137e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
137f0 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
13800 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
13810 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
13820 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
13830 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
13840 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
13850 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
13860 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
13870 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
13880 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
13890 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
138a0 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
138b0 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
138c0 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
138d0 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
138e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
138f0 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
13900 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
13910 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
13920 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
13930 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
13940 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13950 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
13960 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
13970 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
13980 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
13990 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
139a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
139b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
139c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
139d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
139e0 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20  bSizeValid ){.  
139f0 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
13a00 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
13a10 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
13a20 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
13a30 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
13a40 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50  le);.    if( (pP
13a50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
13a60 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20  ds).     && (rc 
13a70 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
13a80 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
13a90 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
13aa0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
13ab0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
13ac0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13ad0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
13ae0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
13af0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
13b00 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
13b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
13b20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13b30 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13b40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
13b50 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
13b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
13b70 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a  Size = (Pgno)n;.
13b80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
13b90 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67 6e 6f  FileSize = (Pgno
13ba0 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  )n;.      pPager
13bb0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
13bc0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
13bd0 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
13be0 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
13bf0 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
13c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50  ;.  }.  if( n>pP
13c10 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
13c20 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
13c30 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20 20  no = (Pgno)n;.  
13c40 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29  }.  if( pnPage )
13c50 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20  {.    *pnPage = 
13c60 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20 72 65  (int)n;.  }.  re
13c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c80 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
13c90 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
13ca0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
13cb0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
13cc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13cd0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
13ce0 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
13cf0 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
13d00 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
13d10 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
13d20 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
13d30 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
13d40 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
13d50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
13d60 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
13d70 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
13d80 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
13d90 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
13da0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
13db0 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
13dc0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
13dd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13de0 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
13df0 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
13e00 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
13e10 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
13e20 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
13e30 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
13e40 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
13e50 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
13e60 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
13e70 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
13e80 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
13e90 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
13ea0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
13eb0 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
13ec0 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
13ed0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
13ee0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13ef0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13f00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
13f20 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
13f30 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
13f40 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
13f50 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
13f60 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
13f70 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
13f80 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
13f90 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
13fa0 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
13fb0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
13fc0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
13fd0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
13fe0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
13ff0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
14000 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
14010 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
14020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14030 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
14040 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
14050 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
14060 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
14070 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
14080 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
14090 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
140a0 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
140b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
140c0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
140d0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
140e0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
140f0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
14100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
14110 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
14120 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
14130 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
14140 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
14150 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
14160 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
14170 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
14180 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14190 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
141a0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
141b0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69  Valid==0 );..  i
141c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
141d0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
141e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
141f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
14200 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
14210 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
14220 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
14230 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
14240 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
14250 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
14260 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
14270 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
14280 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
14290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
142a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
142b0 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
142c0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
142d0 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
142e0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
142f0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
14300 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14310 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
14320 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
14330 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
14340 69 66 69 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 55 6e  ified. .**.** Un
14350 6c 65 73 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  less an IO error
14360 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66 75   occurs, this fu
14370 6e 63 74 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  nction is guaran
14380 74 65 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  teed to modify t
14390 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
143a0 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 49 66 20  file itself. If 
143b0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
143c0 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 20 77 68  k is not held wh
143d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
143e0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 6f  .** is called, o
143f0 6e 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62  ne is obtained b
14400 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
14410 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e   the file..*/.in
14420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
14430 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
14440 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
14450 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
14470 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14480 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
14490 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
144a0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
144b0 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  r, 0);.  if( pPa
144c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
144d0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
144e0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
144f0 65 20 69 66 28 20 6e 50 61 67 65 3c 70 50 61 67  e if( nPage<pPag
14500 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
14510 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  {.    rc = syncJ
14520 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
14530 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
14550 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
14560 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
14570 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
14580 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
14590 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
145a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
145b0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
145c0 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  CK);.    }.    i
145d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
145e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
145f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
14600 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
14610 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
14620 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14640 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 72  OVACUUM./*.** Tr
14650 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
14660 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
14670 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
14680 65 20 70 61 67 65 73 2e 20 55 6e 6c 69 6b 65 0a  e pages. Unlike.
14690 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ** sqlite3PagerT
146a0 72 75 6e 63 61 74 65 28 29 2c 20 74 68 69 73 20  runcate(), this 
146b0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
146c0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
146d0 79 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  y the.** databas
146e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
146f0 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  It just sets the
14700 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
14710 6f 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  of the pager.** 
14720 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
14730 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  he truncation wi
14740 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
14750 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20  the current .** 
14760 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
14770 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
14780 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
14790 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
147a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
147b0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
147c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
147d0 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Valid );.  asser
147e0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
147f0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70 50  e>=nPage );.  pP
14800 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
14810 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Page;.}../*.** R
14820 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
14830 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
14840 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
14850 65 20 69 6e 20 70 61 67 65 73 2e 20 54 68 69 73  e in pages. This
14860 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 69 66  .** function dif
14870 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  fers from sqlite
14880 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14890 29 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  ) in two ways:.*
148a0 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d 61 79 20  *.**  a) It may 
148b0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
148c0 68 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  hen at least one
148d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
148e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
148f0 70 61 67 65 20 69 73 20 68 65 6c 64 2e 20 54 68  page is held. Th
14900 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
14910 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
14920 73 69 7a 65 20 69 73 20 61 6c 72 65 61 64 79 0a  size is already.
14930 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20 61 6e 64  **     known and
14940 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
14950 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 69  e3OsFileSize() i
14960 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
14970 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65 20 72 65  **.**  b) The re
14980 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e 6f  turn value is no
14990 74 20 61 64 6a 75 73 74 65 64 20 66 6f 72 20 74  t adjusted for t
149a0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2e  he locking page.
149b0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
149c0 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65 28 50  PagerImageSize(P
149d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
149e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149f0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
14a00 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
14a10 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  >dbSize;.}.#endi
14a20 66 20 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  f  /* ifndef SQL
14a30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14a40 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 68  UUM */../*.** Sh
14a50 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
14a60 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
14a70 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
14a80 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
14a90 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
14aa0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
14ab0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
14ac0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
14ad0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
14ae0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
14af0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
14b00 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
14b10 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
14b20 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
14b30 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
14b40 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
14b50 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
14b60 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
14b70 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
14b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
14b90 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
14ba0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
14bb0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
14bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
14bd0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
14be0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14bf0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
14c00 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
14c10 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
14c20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14c30 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
14c40 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
14c50 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
14c60 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
14c70 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
14c80 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
14c90 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
14ca0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14cb0 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
14cc0 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64 69   *pPager){..  di
14cd0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
14ce0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
14cf0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14d00 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61  nMalloc();.  pPa
14d10 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
14d20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
14d30 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
14d40 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14d50 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ger);.  if( !MEM
14d60 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  DB ){.    pagerU
14d70 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14d80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
14d90 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
14da0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
14db0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14dc0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45  Malloc();.  PAGE
14dd0 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  RTRACE2("CLOSE %
14de0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14df0 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
14e00 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
14e10 20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20   pPager)).  if( 
14e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e30 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
14e40 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14e50 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
14e60 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
14e70 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
14e80 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  urnal);.  sqlite
14e90 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
14ea0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
14eb0 6c 6c 62 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61  llback);.  relea
14ec0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70  seAllSavepoint(p
14ed0 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
14ee0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14ef0 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
14f00 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
14f10 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
14f20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
14f30 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
14f40 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
14f50 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14f60 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
14f70 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
14f80 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
14f90 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
14fa0 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
14fb0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
14fc0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
14fd0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
14fe0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
14ff0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
15000 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
15010 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15020 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
15030 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
15040 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
15050 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
15060 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
15070 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
15080 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
15090 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
150a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
150b0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
150c0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
150d0 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
150e0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
150f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
15100 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
15110 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15120 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
15130 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
15140 52 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  Ref(pPg);.  retu
15150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15160 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
15170 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
15180 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
15190 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
151a0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
151b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
151c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
151d0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
151e0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
151f0 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
15200 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
15210 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
15220 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
15230 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
15240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
15250 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
15260 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
15270 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
15280 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
15290 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
152a0 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
152b0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
152c0 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
152d0 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
152e0 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
152f0 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
15300 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
15310 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
15320 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
15330 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
15340 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
15350 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
15360 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
15370 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
15380 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
15390 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
153a0 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
153b0 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
153c0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
153d0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
153e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
153f0 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
15400 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
15410 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
15420 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
15430 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
15440 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
15450 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
15460 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
15470 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
15480 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
15490 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
154a0 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
154b0 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
154c0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
154d0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
154e0 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
154f0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
15500 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
15510 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
15520 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
15530 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
15540 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
15550 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
15560 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
15570 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
15580 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
15590 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
155a0 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
155b0 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
155c0 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
155d0 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
155e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
155f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15600 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
15610 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
15620 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
15630 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
15640 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
15650 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
15660 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15670 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15680 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
15690 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
156a0 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
156b0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
156c0 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
156d0 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
156e0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
156f0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
15700 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
15710 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
15720 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
15730 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
15740 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
15750 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
15760 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
15770 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
15780 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
15790 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
157a0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
157b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
157c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
157d0 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69  Open );..      i
157e0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
157f0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
15800 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
15810 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
15820 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
15830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
15840 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
15850 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
15860 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
15870 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
15880 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
15890 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
158a0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
158b0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
158c0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
158d0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
158e0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
158f0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
15900 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
15910 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
15920 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
15930 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
15940 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
15950 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
15960 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
15970 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
15980 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
15990 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
159a0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
159b0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
159c0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
159d0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
159e0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
159f0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
15a00 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
15a10 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
15a20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
15a30 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
15a40 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
15a50 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
15a60 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
15a70 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
15a80 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
15a90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
15aa0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
15ab0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
15ac0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
15ad0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
15ae0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
15af0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
15b00 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
15b10 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
15b20 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
15b30 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
15b40 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
15b50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
15b60 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
15b80 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
15b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
15ba0 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
15bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15bc0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
15bd0 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
15be0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
15bf0 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
15c00 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
15c10 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
15c20 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
15c30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
15c40 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
15c50 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
15c60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15c80 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
15c90 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
15ca0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
15cb0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
15cc0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
15cd0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
15ce0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
15cf0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
15d00 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
15d10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15d20 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
15d30 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
15d40 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
15d50 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
15d60 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
15d70 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
15d80 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
15d90 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
15da0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
15db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15dc0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
15dd0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
15de0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
15df0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15e00 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
15e10 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
15e20 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
15e30 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
15e40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
15e50 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
15e60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15e70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
15e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
15e90 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
15ea0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
15eb0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
15ec0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
15ed0 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
15ee0 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
15ef0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15f00 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72  ile. No calls ar
15f10 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  e made.** to the
15f20 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d   page-cache to m
15f30 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73  ark the pages as
15f40 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68   clean. It is th
15f50 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15f60 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
15f70 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43  r to use PcacheC
15f80 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61  leanAll() or Pca
15f90 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74  cheMakeClean() t
15fa0 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61  o mark.** the pa
15fb0 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  ges as clean..*/
15fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15fd0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
15fe0 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
15ff0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
16000 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
16010 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16030 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
16040 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
16050 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
16060 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
16070 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
16080 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16090 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
160a0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
160b0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
160c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
160d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
160e0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
160f0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
16100 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
16110 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
16120 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
16130 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
16140 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
16150 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
16160 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
16170 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
16180 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
16190 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
161a0 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
161b0 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
161c0 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
161d0 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
161e0 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
161f0 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
16200 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
16210 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
16220 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
16230 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
16240 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
16250 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
16260 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
16270 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
16280 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
16290 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
162a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
162b0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
162c0 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
162d0 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
162e0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
162f0 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
16300 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
16310 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16320 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
16330 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
16340 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
16350 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
16360 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16370 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
16380 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
16390 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
163a0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
163b0 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
163c0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
163d0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
163e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
163f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16400 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16410 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
16420 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
16430 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
16440 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
16450 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
16460 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
16470 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
16480 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
16490 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
164a0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
164b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
164c0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
164d0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
164e0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
164f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
16500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16510 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
16520 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
16530 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
16540 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
16550 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
16560 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
16570 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
16580 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
16590 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
165a0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
165b0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
165c0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
165d0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
165e0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
165f0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
16600 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
16610 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
16620 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
16630 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
16640 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
16650 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
16660 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
16670 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
16680 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
16690 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
166a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
166b0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
166c0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
166d0 70 44 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70 67  pData, pList->pg
166e0 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20 20 20 20 50  no, 6);..      P
166f0 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52  AGERTRACE4("STOR
16700 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
16710 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16730 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16740 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67  pList->pgno, pag
16750 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
16760 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  t));.      IOTRA
16770 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
16780 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
16790 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  st->pgno));.    
167a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
167b0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
167c0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
167d0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
167e0 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
167f0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
16800 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
16810 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
16820 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
16830 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
16840 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  List->pgno==1 ){
16850 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
16860 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
16870 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
16880 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
16890 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
168a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
168b0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
168c0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
168d0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
168e0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
168f0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  List->pgno;.    
16900 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
16910 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
16920 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
16930 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
16940 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
16950 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
16960 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
16970 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
16980 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16990 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
169a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
169b0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
169c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
169d0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
169e0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
169f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
16a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16a10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16a20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16a30 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
16a40 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
16a50 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
16a60 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
16a70 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d  limit. The argum
16a80 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
16a90 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20   to a purgeable 
16aa0 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74  Pager .** object
16ab0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
16ac0 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65  attempts to make
16ad0 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20   a single dirty 
16ae0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f  page that has no
16af0 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
16b00 72 65 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f  references (if o
16b10 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e  ne exists) clean
16b20 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
16b30 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20  be recycled .** 
16b40 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
16b50 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yer..*/.static i
16b60 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
16b70 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
16b80 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
16b90 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
16ba0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
16bb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
16bc0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
16bd0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
16be0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16bf0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
16c00 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
16c10 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
16c20 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
16c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
16c40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
16c50 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
16c60 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
16c70 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
16c80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16c90 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
16ca0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20  >fullSync && .  
16cb0 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
16cc0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
16cd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
16ce0 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
16cf0 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
16d00 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
16d10 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
16d20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
16d30 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29  _APPEND).      )
16d40 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
16d50 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
16d60 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
16d70 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
16d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16d90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
16db0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
16dc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
16dd0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
16de0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
16df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16e00 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
16e10 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16e20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
16e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16e40 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
16e50 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
16e60 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
16e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16e80 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
16e90 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
16ea0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
16eb0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
16ec0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
16ed0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
16ee0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
16ef0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
16f00 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
16f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
16f20 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
16f30 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
16f40 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
16f50 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
16f60 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
16f70 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
16f80 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
16f90 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
16fa0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
16fb0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
16fc0 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62 6c  egative if unabl
16fd0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
16fe0 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65  he status of the
16ff0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
17000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
17010 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a  s not open the j
17020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
17030 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f  xamine its.** co
17040 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74  ntent.  Hence, t
17050 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
17060 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d   contain the nam
17070 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a  e of a master.**
17080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
17090 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  at has been dele
170a0 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e  ted, and hence n
170b0 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a  ot be hot.  Or.*
170c0 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
170d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
170e0 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e  t be zeroed out.
170f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
17100 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f  * does not disco
17110 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20  ver these cases 
17120 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  of a non-hot jou
17130 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a  rnal - if the.**
17140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
17150 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
17160 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69  empty this routi
17170 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a  ne assumes it.**
17180 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61   is hot.  The pa
17190 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
171a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
171b0 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a  over that the.**
171c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
171d0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
171e0 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a  and will no-op..
171f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
17200 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
17210 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
17220 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
17230 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
17240 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
17250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17260 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73  OK;.  int exists
17270 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b   = 0;.  int lock
17280 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ed = 0;.  assert
17290 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
172a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
172b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
172c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
172d0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  >fd->pMethods );
172e0 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
172f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17300 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
17310 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
17320 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
17330 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
17340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17350 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
17360 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17370 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
17380 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
17390 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20   &locked);.  }. 
173a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173b0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26 20  OK && exists && 
173c0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69  !locked ){.    i
173d0 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63  nt nPage;.    rc
173e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
173f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17400 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
17410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17420 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67  ){.     if( nPag
17430 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
17440 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17450 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
17460 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
17470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17480 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
17490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
174a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
174b0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
174c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
174d0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
174e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
174f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
17500 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  DbPage(Pager *pP
17510 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
17520 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
17530 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66  int rc;.  i64 of
17540 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
17550 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73  MEMDB==0 );.  as
17560 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
17570 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
17580 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
17590 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
175a0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
175b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
175c0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
175d0 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
175e0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
175f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17610 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
17620 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
17630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17640 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f  ffset);.  PAGER_
17650 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
17660 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
17670 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
17680 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
17690 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
176a0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
176b0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  , pgno));.  if( 
176c0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d  pgno==1 ){.    m
176d0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
176e0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
176f0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
17700 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
17740 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17750 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
17760 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
17770 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
17780 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54  PAGERTRACE4("FET
17790 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
177a0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
177b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
177c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
177d0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
177e0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
177f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
17800 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17810 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
17820 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65  obtain the share
17830 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20  d lock required 
17840 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d  before.** data m
17850 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ay be read from 
17860 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
17870 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c   If the shared l
17880 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ock has already.
17890 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ** been obtained
178a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
178b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
178c0 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  * Immediately af
178d0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  ter obtaining th
178e0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69  e shared lock (i
178f0 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69  f required), thi
17900 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68  s function.** ch
17910 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a  ecks for a hot-j
17920 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
17930 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e  one is found, an
17940 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
17950 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72  ack.** is perfor
17960 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  med immediately.
17970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17980 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
17990 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
179a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
179b0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72 72  _OK;.  int isErr
179c0 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20  orReset = 0;..  
179d0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
179e0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
179f0 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
17a00 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
17a10 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
17a20 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
17a30 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
17a40 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68  state, now is th
17a50 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  e chance to clea
17a60 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
17a70 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
17a80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
17a90 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
17aa0 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
17ab0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
17ac0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
17ad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
17ae0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
17af0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
17b00 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
17b10 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
17b20 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
17b30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17b40 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
17b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17b60 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  n ){.      isErr
17b70 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
17b80 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
17b90 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
17ba0 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
17bb0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
17bc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
17bd0 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
17be0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
17bf0 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
17c00 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
17c10 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
17c20 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
17c30 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
17c40 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
17c50 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
17c60 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
17c70 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
17c80 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
17c90 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
17ca0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
17cb0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
17cc0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
17cd0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17ce0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
17cf0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
17d00 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
17d10 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
17d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
17d30 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
17d40 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69  >pVfs;.    int i
17d50 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sHotJournal = 0;
17d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
17d70 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
17d80 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
17d90 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
17da0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
17db0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
17dc0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
17dd0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
17de0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
17df0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
17e00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17e30 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
17e40 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
17e50 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
17e60 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
17e70 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
17e80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17e90 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
17ea0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a  _LOCK );.    }..
17eb0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
17ec0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
17ed0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
17ee0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
17ef0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
17f00 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
17f10 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
17f20 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
17f30 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
17f40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
17f50 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
17f60 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
17f70 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
17f80 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
17f90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17fb0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17fd0 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
17fe0 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
17ff0 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
18000 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
18010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18020 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
18030 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
18040 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
18050 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
18060 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
18070 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
18080 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
18090 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
180a0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
180b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
180c0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
180d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
180e0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
180f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
18100 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
18110 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
18120 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
18130 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
18140 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
18150 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
18160 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
18170 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
18180 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
18190 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
181a0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
181b0 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
181c0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
181d0 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
181e0 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
181f0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
18200 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62  l to.      ** ob
18210 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
18220 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
18230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18240 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18260 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
18270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
18280 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
18290 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
182a0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
182b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
182c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
182d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
182e0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
182f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
18300 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
18310 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
18320 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18330 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
18340 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
18350 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
18360 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
18370 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
18380 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
18390 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
183a0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
183b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
183c0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
183d0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
183e0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
183f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
18400 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
18410 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
18420 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
18430 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
18440 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
18450 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
18460 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
18470 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
18480 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
18490 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f       if( !isErro
184a0 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65 72  rReset && pPager
184b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
184c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
184d0 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
184e0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
184f0 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
18500 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
18510 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
18520 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
18530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18550 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
18560 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
18570 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
18580 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
18590 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
185a0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
185b0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
185c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
185d0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
185e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
185f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18600 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
18610 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
18620 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
18630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
18650 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
18660 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
18670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18680 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
18690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
186a0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
186b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
186c0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
186d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
186e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
186f0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
18700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
18710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18720 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
18730 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
18740 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73  st, that means s
18750 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
18760 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
18770 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c   has already rol
18780 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20  led it back */. 
18790 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
187a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
187b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
187c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
187d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
187e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
187f0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
18800 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
18810 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
18820 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18830 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
18840 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
18850 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
18860 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18870 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
18880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
18890 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
188a0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
188b0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
188c0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
188d0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
188e0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
188f0 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
18900 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
18910 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
18920 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
18930 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
18940 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18950 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18960 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
18970 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
18980 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
18990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
189a0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73  assert(pPager->s
189b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
189c0 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ED || .         
189d0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
189e0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
189f0 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
18a00 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
18a20 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
18a30 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
18a40 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
18a50 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
18a60 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
18a70 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
18a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18a90 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
18aa0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
18ab0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
18ac0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
18ad0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
18ae0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
18af0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
18b00 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
18b10 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
18b20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
18b30 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
18b40 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
18b50 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
18b60 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
18b70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
18b80 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
18b90 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
18ba0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
18bb0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
18bc0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
18bd0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
18be0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
18bf0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
18c00 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
18c10 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
18c20 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
18c30 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
18c40 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
18c50 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
18c60 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
18c70 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
18c80 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
18c90 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
18ca0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
18cb0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
18cc0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
18cd0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
18ce0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
18cf0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
18d00 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
18d10 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
18d20 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
18d30 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
18d40 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
18d50 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
18d60 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
18d70 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
18d80 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
18d90 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
18da0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18db0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
18dc0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
18dd0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
18de0 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
18df0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
18e00 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
18e10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18e20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18e30 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
18e40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18e50 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
18e60 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
18e70 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
18e80 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
18e90 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
18ea0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18eb0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
18ec0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
18ed0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
18ee0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
18ef0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
18f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
18f40 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
18f50 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
18f60 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
18f70 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
18f80 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
18f90 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
18fa0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
18fb0 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
18fc0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
18fd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18fe0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
18ff0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
19000 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
19010 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
19020 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
19030 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19040 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19050 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
19060 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19070 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
19080 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
19090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
190a0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
190b0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
190c0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
190d0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
190e0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
190f0 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
19100 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
19110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19120 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19130 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
19140 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
19150 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
19160 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
19170 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
19180 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
19190 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
191a0 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
191b0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
191c0 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
191d0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
191e0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
191f0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
19200 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
19210 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
19220 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
19230 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
19240 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
19250 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19260 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
19270 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
19280 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
19290 26 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  &PGHDR_NEED_READ
192a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
192b0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
192c0 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
192d0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
192e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
192f0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  ){.      pPg->fl
19300 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
19310 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c  ED_READ;.    }el
19320 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
19330 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
19340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19350 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
19360 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
19370 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
19380 65 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61 67  ero, and the pag
19390 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  er is not in the
193a0 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  .** middle of a 
193b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
193c0 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20 65  n or opened in e
193d0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 75  xclusive mode, u
193e0 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74  nlock it..*/ .st
193f0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
19400 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
19410 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19420 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
19430 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
19440 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a  r->pPCache)==0).
19450 20 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d      && (!pPager-
19460 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
19470 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
19480 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20  lOff>0) .  ){.  
19490 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
194a0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
194b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
194c0 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20  rop a page from 
194d0 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
194e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
194f0 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  p()..**.** If th
19500 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
19510 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20  re now no pages 
19520 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20  with references 
19530 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62  to them, a rollb
19540 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e  ack.** occurs an
19550 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
19560 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
19570 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  moved..*/.static
19580 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50   void pagerDropP
19590 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  age(DbPage *pPg)
195a0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
195b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
195c0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
195d0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67  Drop(pPg);.  pag
195e0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
195f0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
19600 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19610 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
19620 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
19630 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
19640 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
19650 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
19660 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
19670 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
19680 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
19690 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
196a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
196b0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
196c0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
196d0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
196e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
196f0 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
19700 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
19710 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
19720 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
19730 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
19740 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
19750 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
19760 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
19770 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
19780 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
19790 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
197a0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
197b0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
197c0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
197d0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
197e0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
197f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
19800 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
19810 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
19820 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
19830 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
19840 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
19850 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
19860 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
19870 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
19880 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
19890 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
198a0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
198b0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
198c0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
198d0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
198e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
198f0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
19900 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
19910 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
19920 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
19930 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
19940 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
19950 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
19960 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
19970 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
19980 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
19990 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
199a0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
199b0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
199c0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
199d0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
199e0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
199f0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
19a00 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
19a10 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
19a20 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
19a30 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
19a40 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
19a50 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
19a60 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
19a70 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
19a80 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
19a90 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
19aa0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
19ab0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
19ac0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
19ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
19ae0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
19af0 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
19b00 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
19b10 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
19b20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
19b30 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
19b40 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
19b50 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
19b60 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
19b70 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
19b80 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
19b90 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
19ba0 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
19bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19bc0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
19bd0 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
19be0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
19bf0 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
19c00 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
19c10 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
19c20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
19c30 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
19c40 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
19c50 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
19c60 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
19c70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
19c80 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
19c90 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
19ca0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
19cb0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19cc0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
19cd0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
19ce0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
19cf0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
19d00 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
19d10 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
19d20 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
19d30 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
19d40 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
19d50 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
19d60 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
19d70 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
19d80 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
19d90 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
19da0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
19db0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
19dc0 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20  _UNLOCK .       
19dd0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
19de0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
19df0 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
19e00 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20      || pgno==1. 
19e10 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
19e20 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
19e30 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
19e40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19e50 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
19e60 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
19e70 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
19e80 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
19e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
19ea0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
19eb0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
19ec0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
19ed0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
19ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19ef0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
19f00 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
19f10 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
19f20 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
19f30 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
19f40 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
19f50 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
19f60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
19f70 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
19f80 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
19f90 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
19fa0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
19fb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
19fc0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
19fd0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
19fe0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
19ff0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1a000 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
1a010 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1a020 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1a030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a040 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a050 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1a060 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a070 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
1a080 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1a090 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
1a0a0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
1a0b0 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
1a0c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a0d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a0e0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
1a0f0 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ager==0 ){.    /
1a100 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
1a110 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
1a120 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
1a130 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
1a140 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
1a150 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  lized..    */.  
1a160 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1a170 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1a180 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
1a190 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
1a1a0 67 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ger;.    memset(
1a1b0 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  pPg->pExtra, 0, 
1a1c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1a1d0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1a1e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1a1f0 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
1a200 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a220 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1a230 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
1a240 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1a250 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
1a260 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
1a270 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
1a280 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1a290 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1a2a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a2b0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1a2c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a2d0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1a2e0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
1a2f0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1a300 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a310 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  e);.      if( no
1a320 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1a330 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1a340 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44   PGHDR_NEED_READ
1a350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a360 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
1a370 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1a380 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
1a390 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1a3a0 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
1a3b0 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
1a3c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a3d0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1a3e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a3f0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1a400 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  /* sqlite3PagerU
1a410 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20  nref(pPg); */.  
1a420 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
1a430 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
1a440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a450 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
1a460 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1a470 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
1a480 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1a490 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1a4a0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1a4b0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1a4c0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
1a4d0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1a4e0 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c 69  .    assert(sqli
1a4f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1a500 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1a510 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  e)>0 || pgno==1)
1a520 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1a530 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1a540 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1a550 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1a560 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1a570 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1a580 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1a590 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1a5a0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1a5b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a5c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1a5d0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
1a5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a5f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
1a600 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
1a610 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
1a620 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1a630 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
1a640 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
1a650 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
1a660 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1a670 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
1a680 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1a690 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
1a6a0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
1a6b0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
1a6c0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1a6d0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1a6e0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
1a6f0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
1a700 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
1a710 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
1a720 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
1a730 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
1a740 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1a750 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
1a760 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1a770 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1a780 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1a790 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
1a7a0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
1a7b0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
1a7c0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
1a7d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1a7e0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1a7f0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1a800 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
1a810 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a820 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1a830 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
1a840 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
1a850 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29  e!=PAGER_UNLOCK)
1a860 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1a870 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
1a880 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  OK || pPager->er
1a890 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
1a8a0 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  LL).  ){.    sql
1a8b0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
1a8c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
1a8d0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
1a8e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
1a8f0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1a900 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1a910 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1a920 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1a930 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1a940 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1a950 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1a960 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1a970 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1a980 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1a990 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1a9a0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1a9b0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1a9c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a9d0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1a9e0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1a9f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1aa00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
1aa10 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
1aa20 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1aa30 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
1aa40 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
1aa50 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
1aa60 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
1aa70 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1aa80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aa90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1aaa0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
1aab0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1aac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1aad0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
1aae0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1aaf0 26 20 21 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d  & !pPager->sjfd-
1ab00 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1ab10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1ab20 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1ab30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1ab40 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
1ab50 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
1ab60 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
1ab70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ab80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ab90 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
1aba0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
1abb0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
1abc0 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
1abd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1abe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1abf0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
1ac00 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
1ac10 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
1ac20 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
1ac30 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
1ac40 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ac50 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1ac60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ac70 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
1ac80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1ac90 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
1aca0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
1acb0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
1acc0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
1acd0 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
1ace0 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
1acf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
1ad00 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
1ad10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
1ad20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1ad30 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1ad40 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
1ad50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1ad60 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1ad70 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
1ad80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
1ad90 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1ada0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1adb0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1adc0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1add0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1ade0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1adf0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1ae00 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
1ae10 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1ae20 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50  pPager, 0);.  pP
1ae30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1ae40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1ae50 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
1ae60 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
1ae70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1ae80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1ae90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1aea0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1aeb0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1aec0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1aed0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1aee0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1aef0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1af00 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
1af10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1af20 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
1af30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1af40 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
1af50 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
1af60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1af70 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
1af80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1af90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1afa0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1afb0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1afc0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1afd0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
1afe0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  d);.      rc = S
1aff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b000 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1b010 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1b020 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
1b030 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1b040 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
1b050 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1b060 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1b070 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
1b080 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
1b090 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
1b0a0 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
1b0b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1b0c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1b0d0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1b0e0 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
1b0f0 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
1b100 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1b110 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
1b120 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
1b130 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b140 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
1b150 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1b160 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b170 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1b180 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b1a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1b1b0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  OMEM ){.        
1b1c0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1b1d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1b1e0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
1b1f0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66    }.      goto f
1b200 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1b210 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  urnal;.    }.  }
1b220 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1b230 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
1b240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1b250 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
1b260 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1b270 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
1b280 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1b290 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1b2a0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1b2b0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74  errCode;.    got
1b2c0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1b2d0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1b2e0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1b2f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1b300 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
1b310 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1b320 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
1b330 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
1b340 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1b350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
1b360 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
1b370 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1b380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1b390 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1b3a0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1b3b0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
1b3c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1b3d0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1b3e0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ger, 0);.    if(
1b3f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b410 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1b420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b430 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
1b440 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
1b450 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
1b460 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
1b470 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
1b480 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
1b490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b4a0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1b4b0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1b4c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1b4d0 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
1b4e0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
1b4f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b500 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
1b510 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1b520 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1b530 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1b540 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1b550 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
1b560 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1b570 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1b580 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1b590 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1b5a0 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
1b5b0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
1b5c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1b5d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1b5e0 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
1b5f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b600 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
1b610 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
1b620 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1b630 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
1b640 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
1b650 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
1b660 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
1b670 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
1b680 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1b690 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
1b6a0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
1b6b0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
1b6c0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1b6d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1b6e0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1b6f0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
1b700 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
1b710 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
1b720 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
1b730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
1b740 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
1b750 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1b760 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1b770 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1b780 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1b790 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1b7a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1b7b0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1b7c0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1b7d0 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1b7e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1b7f0 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1b800 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1b810 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1b820 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1b830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1b840 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1b850 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1b860 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1b870 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1b880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1b890 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1b8a0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1b8b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1b8c0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1b8d0 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1b8e0 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1b8f0 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1b900 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1b910 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1b920 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1b930 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1b940 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1b950 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1b960 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1b970 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1b980 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1b990 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1b9a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b9b0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
1b9c0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1b9d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b9e0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1b9f0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1ba00 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1ba10 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1ba20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1ba30 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1ba40 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
1ba50 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  B );.    rc = sq
1ba60 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1ba70 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
1ba80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
1ba90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1baa0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1bab0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
1bac0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
1bad0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1bae0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1baf0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1bb00 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1bb10 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
1bb20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1bb30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bb40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1bb50 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  }.    pPager->di
1bb60 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
1bb70 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
1bb80 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
1bb90 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1bba0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ));.    if( pPag
1bbb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
1bbc0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
1bbd0 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ile.           &
1bbe0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1bbf0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1bc00 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
1bc10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1bc20 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1bc30 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1bc40 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1bc50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1bc60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bc70 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1bc80 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1bc90 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1bca0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1bcb0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
1bcc0 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
1bcd0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
1bce0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1bcf0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
1bd00 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
1bd10 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1bd20 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
1bd30 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
1bd40 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
1bd50 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
1bd60 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
1bd70 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1bd80 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
1bd90 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
1bda0 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
1bdb0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
1bdc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bdd0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1bde0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1bdf0 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
1be00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1be10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1be20 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1be30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1be40 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Pager, 0);.    p
1be50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1be60 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
1be70 63 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d  cCreate( pPager-
1be80 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  >dbSize );.    i
1be90 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  f( !pPager->pInJ
1bea0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1beb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1bec0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1bed0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
1bee0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
1bef0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1bf00 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1bf10 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1bf20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1bf30 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1bf40 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1bf50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1bf60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bf70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bf80 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
1bf90 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
1bfa0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
1bfb0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1bfc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
1bfd0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1bfe0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
1bff0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
1c000 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
1c010 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
1c020 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
1c030 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1c040 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1c050 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
1c060 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
1c070 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
1c080 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
1c090 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
1c0a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
1c0b0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
1c0c0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
1c0d0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
1c0e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c0f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
1c100 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
1c110 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
1c120 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
1c130 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
1c140 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
1c150 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
1c160 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
1c170 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c180 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1c190 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c1a0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
1c1b0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
1c1c0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
1c1d0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
1c1e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c1f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
1c200 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
1c210 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
1c220 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
1c230 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
1c240 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
1c250 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
1c260 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
1c270 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1c280 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
1c290 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1c2a0 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
1c2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1c2c0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
1c2d0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
1c2e0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
1c2f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c300 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1c310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c320 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
1c330 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
1c340 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1c350 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
1c360 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1c370 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1c380 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
1c390 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
1c3a0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
1c3b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
1c3c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1c3d0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
1c3e0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
1c3f0 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72  this page was pr
1c400 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
1c410 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
1c420 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  ==1, that means.
1c430 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72    ** we didn't r
1c440 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68  eally read in th
1c450 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1c460 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e   page.  This can
1c470 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f   happen.  ** (fo
1c480 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20  r example) when 
1c490 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
1c4a0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  g moved to the f
1c4b0 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20  reelist.  But.  
1c4c0 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70  ** now we are (p
1c4d0 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74  erhaps) moving t
1c4e0 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74  he page off of t
1c4f0 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a  he freelist for.
1c500 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77    ** reuse and w
1c510 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
1c520 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  ts original cont
1c530 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74  ent so that cont
1c540 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ent.  ** can be 
1c550 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
1c560 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1c570 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20   So do the read 
1c580 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d  at this.  ** tim
1c590 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
1c5a0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1c5b0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20  (pPg);.  if( rc 
1c5c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c5d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
1c5e0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1c5f0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1c600 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1c610 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1c620 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1c630 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1c640 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1c650 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
1c660 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
1c670 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
1c680 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
1c690 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1c6a0 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  Pg) ){.    pPage
1c6b0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1c6c0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  1;.    pPager->d
1c6d0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
1c6e0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
1c6f0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
1c700 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
1c710 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
1c720 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
1c730 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
1c740 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c750 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
1c760 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
1c770 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
1c780 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
1c790 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
1c7a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c7b0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1c7c0 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
1c7d0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
1c7e0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1c7f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c800 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c810 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
1c820 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1c830 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
1c840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c850 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c860 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1c870 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c880 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1c890 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
1c8a0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1c8b0 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1c8c0 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
1c8d0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1c8e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1c8f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1c900 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
1c910 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1c920 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1c930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c940 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1c950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1c960 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1c970 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1c980 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
1c990 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1c9a0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1c9b0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1c9c0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1c9d0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1c9e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1c9f0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1ca00 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1ca10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1ca20 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1ca30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1ca40 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1ca50 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1ca60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ca70 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
1ca80 50 67 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Pg) && pPager->j
1ca90 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1caa0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1cab0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
1cac0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
1cad0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
1cae0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1caf0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
1cb00 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
1cb10 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
1cb20 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
1cb30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1cb40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1cb50 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1cb60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1cb70 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1cb80 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1cb90 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1cba0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1cbb0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
1cbc0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
1cbd0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1cbe0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1cbf0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1cc00 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73   7);.        cks
1cc10 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
1cc20 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
1cc30 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
1cc40 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1cc50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1cc60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1cc70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1cc80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1cc90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ccb0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1ccc0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
1ccd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1cd00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1cd10 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
1cd20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cd30 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
1cd40 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
1cd50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1cd60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cd70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1cd80 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1cd90 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1cda0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
1cdb0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
1cdc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1cdd0 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
1cde0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1cdf0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
1ce00 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
1ce10 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ce40 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
1ce50 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
1ce60 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1ce70 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
1ce80 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
1ce90 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55  PAGERTRACE5("JOU
1cea0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
1ceb0 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
1cec0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1ced0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1cee0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1cef0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
1cf00 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
1cf10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
1cf20 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
1cf30 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20  hash(pPg));..   
1cf40 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
1cf50 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
1cf60 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
1cf70 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
1cf80 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
1cf90 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
1cfa0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
1cfb0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
1cfc0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
1cfd0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
1cfe0 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
1cff0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d000 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
1d010 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
1d020 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
1d030 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
1d040 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
1d050 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
1d060 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
1d070 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d080 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
1d090 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
1d0a0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
1d0b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1d0c0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
1d0d0 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
1d0e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
1d0f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d100 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1d110 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1d120 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1d130 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1d140 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1d150 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1d160 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
1d170 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
1d180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d190 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
1d1a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1d1b0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1d1c0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1d1d0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
1d1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d210 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1d220 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1d230 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1d240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1d250 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1d260 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d270 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1d280 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1d290 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d2a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1d2b0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1d2c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d2d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1d2e0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
1d2f0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
1d300 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
1d310 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1d320 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1d330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1d360 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1d370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1d380 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d390 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1d3a0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
1d3b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1d3c0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
1d3d0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
1d3e0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1d3f0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1d400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1d410 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1d420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d430 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1d440 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1d450 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1d460 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d470 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1d480 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1d4a0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d4b0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1d4c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d4d0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1d4e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1d4f0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1d500 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1d510 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1d520 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1d530 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1d540 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1d550 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1d560 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1d570 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1d580 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1d590 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1d5a0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1d5b0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1d5c0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1d5d0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1d5e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d5f0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1d600 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
1d610 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
1d620 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34  ger->stmtNRec*(4
1d630 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1d640 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
1d650 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1d660 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1d670 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
1d680 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
1d690 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c  InJournal(pPg) |
1d6a0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
1d6b0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
1d6c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1d6d0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1d6e0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1d6f0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1d700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d710 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1d720 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1d730 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
1d740 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1d750 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1d760 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
1d770 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1d780 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1d790 70 61 67 65 20 25 64 20 40 20 25 64 5c 6e 22 2c  page %d @ %d\n",
1d7a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d7b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1d7c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d7d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d7e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d7f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1d800 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
1d810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d820 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
1d830 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
1d840 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
1d850 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
1d860 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
1d870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d880 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d890 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
1d8a0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
1d8b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d8c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d8d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1d8e0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1d8f0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1d900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d910 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1d920 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1d930 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
1d940 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
1d950 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
1d960 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
1d970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1d980 28 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  (PAGER_MJ_PGNO(p
1d990 50 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20  Pager)-1) ){.   
1d9a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1d9b0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1d9c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d9d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d9e0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1d9f0 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1da00 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1da10 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1da20 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1da30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1da40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1da50 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1da60 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1da70 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1da80 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1da90 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1daa0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1dab0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1dac0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1dad0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1dae0 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1daf0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1db00 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1db10 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1db20 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1db30 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1db40 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1db50 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1db60 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1db70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1db80 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1db90 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1dba0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1dbb0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1dbc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dbd0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1dbe0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1dbf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1dc00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1dc10 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1dc20 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1dc30 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1dc40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1dc50 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
1dc60 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1dc70 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1dc80 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1dc90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1dca0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1dcb0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1dcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dcd0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1dce0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1dcf0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1dd00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1dd10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1dd20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1dd30 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1dd40 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1dd50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
1dd60 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
1dd70 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
1dd80 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1dd90 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1dda0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1ddb0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1ddc0 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1ddd0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1dde0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1ddf0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1de00 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1de10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1de20 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
1de30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1de40 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1de50 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1de60 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
1de70 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
1de80 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
1de90 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
1dea0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
1deb0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
1dec0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
1ded0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
1dee0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
1def0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
1df00 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1df10 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1df20 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
1df30 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
1df40 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
1df50 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
1df60 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
1df70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1df80 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28  ecount(pPager, (
1df90 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e  int *)&nPageCoun
1dfa0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  t);.    if( pPg-
1dfb0 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
1dfc0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1dfd0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
1dfe0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
1dff0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
1e000 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
1e010 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
1e020 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
1e030 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
1e040 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
1e050 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
1e060 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
1e070 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
1e080 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
1e090 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
1e0a0 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
1e0b0 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
1e0c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1e0d0 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
1e0e0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
1e0f0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
1e100 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
1e110 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
1e120 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
1e130 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
1e140 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1e150 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
1e160 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e170 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
1e180 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1e190 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e1a0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1e1b0 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
1e1c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e1f0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1e200 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e210 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
1e220 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1e230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e240 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1e260 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
1e270 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
1e280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e290 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1e2a0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1e2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e2c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1e2d0 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
1e2e0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1e2f0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
1e300 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
1e310 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1e320 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
1e330 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1e340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e350 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e360 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1e370 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e380 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   If the PgHdr.ne
1e390 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
1e3a0 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
1e3b0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
1e3c0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1e3d0 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
1e3e0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
1e3f0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
1e400 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
1e410 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
1e420 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
1e430 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
1e440 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
1e450 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1e460 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
1e470 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
1e480 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
1e490 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
1e4a0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
1e4b0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1e4c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e4d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e4e0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1e4f0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1e500 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
1e510 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
1e520 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1e530 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
1e540 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
1e550 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
1e560 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1e570 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
1e580 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
1e590 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
1e5a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1e5b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e5c0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1e5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e5e0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1e5f0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
1e600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e610 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1e620 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1e630 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1e640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1e650 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1e660 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1e670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e680 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1e690 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1e6a0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1e6b0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1e6c0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1e6d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1e6e0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1e6f0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1e700 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1e710 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1e720 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1e730 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1e740 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1e750 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1e760 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e770 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
1e780 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
1e790 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1e7a0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1e7b0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1e7c0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1e7d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1e7e0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1e7f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1e800 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
1e810 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1e820 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1e830 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1e840 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
1e850 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
1e860 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
1e870 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1e880 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
1e890 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1e8a0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
1e8b0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
1e8c0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
1e8d0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
1e8e0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
1e8f0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1e900 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
1e910 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
1e920 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
1e930 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
1e940 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
1e950 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
1e960 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
1e970 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1e980 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
1e990 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
1e9a0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
1e9b0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
1e9c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e9d0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
1e9e0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1e9f0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1ea00 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1ea10 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1ea20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1ea30 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1ea40 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1ea50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ea60 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1ea70 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1ea80 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1ea90 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1eaa0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
1eab0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1eac0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
1ead0 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
1eae0 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
1eaf0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1eb00 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
1eb10 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
1eb20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
1eb30 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1eb40 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1eb50 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
1eb60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
1eb70 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
1eb80 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1eb90 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
1eba0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
1ebb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1ebc0 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
1ebd0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
1ebe0 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
1ebf0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
1ec00 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
1ec10 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1ec20 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
1ec30 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
1ec40 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1ec50 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1ec60 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1ec70 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
1ec80 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
1ec90 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1eca0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1ecb0 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
1ecc0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
1ecd0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
1ece0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1ecf0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ) call..*/.int s
1ed00 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1ed10 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1ed20 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
1ed30 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1ed40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ed50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1ed60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
1ed70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ed80 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
1ed90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1eda0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1edb0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1edc0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1edd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ede0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
1edf0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
1ee00 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ysRollback = sql
1ee10 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
1ee20 28 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  (pPager->dbOrigS
1ee30 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
1ee40 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1ee50 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
1ee60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ee70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
1ee80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
1ee90 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1eea0 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  AlwaysRollback, 
1eeb0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69  pPg->pgno);..  i
1eec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eed0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
1eee0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
1eef0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1ef00 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  nt==0 ){.    ass
1ef10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ef20 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1ef30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1ef40 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d  er->dbSize==pPg-
1ef50 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
1ef60 3e 64 62 4f 72 69 67 53 69 7a 65 3c 70 50 61 67  >dbOrigSize<pPag
1ef70 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
1ef80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
1ef90 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
1efa0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
1efb0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
1efc0 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
1efd0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
1efe0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1eff0 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
1f000 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1f010 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
1f020 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1f030 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
1f040 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
1f050 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1f060 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
1f070 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
1f080 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
1f090 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
1f0a0 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
1f0b0 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
1f0c0 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
1f0d0 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
1f0e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f0f0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
1f100 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
1f110 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
1f120 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
1f130 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
1f140 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
1f150 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
1f160 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
1f170 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
1f180 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1f190 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1f1a0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1f1b0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1f1c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1f1d0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f1e0 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1f1f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1f200 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e 66  o)).      pPg->f
1f210 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
1f220 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
1f230 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1f240 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
1f250 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1f260 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1f270 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1f280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f290 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1f2a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1f2b0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1f2c0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1f2d0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1f2e0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1f2f0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1f300 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1f310 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1f320 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1f330 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1f340 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1f350 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1f360 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1f370 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1f380 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  we have not yet 
1f390 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68  actually read th
1f3a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
1f3b0 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68  s page (if.** th
1f3c0 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
1f3d0 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68   flag is set) th
1f3e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1f3f0 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73  acts as a promis
1f400 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c  e.** that we wil
1f410 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  l never need to 
1f420 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f  read the page co
1f430 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74  ntent in the fut
1f440 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e  ure..** so the n
1f450 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e  eedRead flag can
1f460 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74   be cleared at t
1f470 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f  his point..*/.vo
1f480 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1f490 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
1f4a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
1f4b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1f4c0 3e 70 50 61 67 65 72 3b 0a 20 20 54 45 53 54 4f  >pPager;.  TESTO
1f4d0 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20 29 20 20  NLY( int rc; )  
1f4e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1f4f0 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 69 74 76  from sqlite3Bitv
1f500 65 63 53 65 74 28 29 20 2a 2f 0a 0a 20 20 61 73  ecSet() */..  as
1f510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1f520 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1f530 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
1f540 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f550 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
1f560 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
1f570 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
1f580 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
1f590 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
1f5a0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1f5b0 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
1f5c0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1f5d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
1f5e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1f5f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1f600 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42   .   || sqlite3B
1f610 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1f620 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1f630 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20  k, pPg->pgno).  
1f640 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
1f650 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1f660 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1f670 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
1f680 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1f690 54 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  TE.  if( sqlite3
1f6a0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1f6b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
1f6c0 50 67 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20 20 20  Pg->pgno)!=0.   
1f6d0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1f6e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1f6f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1f700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f710 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  If SECURE_DELETE
1f720 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1f730 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  en there is no w
1f740 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  ay that this.  *
1f750 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  * routine can be
1f760 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
1f770 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69  e for which sqli
1f780 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1f790 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e().  ** has not
1f7a0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
1f7b0 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
1f7c0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1f7d0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66  ion..  ** And if
1f7e0 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
1f7f0 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e   previously been
1f800 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c   called, the fol
1f810 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64  lowing.  ** cond
1f820 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
1f830 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c  et..  **.  ** (L
1f840 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72 75 65  ater:)  Not true
1f850 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1f860 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
1f870 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c 69 63  by having duplic
1f880 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6f  ate.  ** pages o
1f890 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
1f8a0 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74 65 73  ex: corrupt9.tes
1f8b0 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  t) then the foll
1f8c0 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20 2a  owing is not.  *
1f8d0 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72  * necessarily tr
1f8e0 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61 73  ue:.  */.  /* as
1f8f0 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f  sert( !pPg->inJo
1f900 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
1f910 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
1f920 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
1f930 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f940 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1f950 6c 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 66  l!=0 );.  pPg->f
1f960 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
1f970 45 45 44 5f 52 45 41 44 3b 0a 0a 20 20 2f 2a 20  EED_READ;..  /* 
1f980 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
1f990 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
1f9a0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
1f9b0 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
1f9c0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
1f9d0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
1f9e0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
1f9f0 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
1fa00 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61   a page.  ** tha
1fa10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
1fa20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  to be journal.  
1fa30 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
1fa40 20 73 75 72 65 20 74 6f 20 74 65 73 74 20 74 68   sure to test th
1fa50 65 0a 20 20 2a 2a 20 63 61 73 65 20 77 68 65 72  e.  ** case wher
1fa60 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
1fa70 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
1fa80 79 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 69  ying to set a bi
1fa90 74 20 69 6e 20 61 20 0a 20 20 2a 2a 20 62 69 74  t in a .  ** bit
1faa0 20 76 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   vector..  */.  
1fab0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1fac0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 54 45  gnMalloc();.  TE
1fad0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
1fae0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
1faf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1fb00 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
1fb10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
1fb20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1fb30 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
1fb40 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
1fb50 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
1fb60 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
1fb70 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
1fb80 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 73  ITE_NOMEM );.  s
1fb90 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1fba0 61 6c 6c 6f 63 28 29 3b 0a 0a 0a 20 20 50 41 47  alloc();...  PAG
1fbb0 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52  ERTRACE3("DONT_R
1fbc0 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
1fbd0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1fbe0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1fbf0 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
1fc00 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64  (("GARBAGE %p %d
1fc10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1fc20 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a  ->pgno)).}.../*.
1fc30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fc40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1fc50 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1fc60 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1fc70 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1fc80 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1fc90 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1fca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1fcb0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1fcc0 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1fcd0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
1fce0 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ect){.  PgHdr *p
1fcf0 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
1fd00 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
1fd10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fd20 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  K;..#ifndef SQLI
1fd30 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1fd40 5f 57 52 49 54 45 0a 20 20 61 73 73 65 72 74 28  _WRITE.  assert(
1fd50 20 69 73 44 69 72 65 63 74 3d 3d 30 20 29 3b 20   isDirect==0 ); 
1fd60 20 2f 2a 20 69 73 44 69 72 65 63 74 20 69 73 20   /* isDirect is 
1fd70 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 61 74  only true for at
1fd80 6f 6d 69 63 20 77 72 69 74 65 73 20 2a 2f 0a 23  omic writes */.#
1fd90 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 61  endif.  if( !pPa
1fda0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1fdb0 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
1fdc0 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
1fdd0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1fde0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1fdf0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
1fe00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fe10 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
1fe20 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
1fe30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fe40 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
1fe50 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29   if( !isDirect )
1fe60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fe70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fe80 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66  PgHdr);.      if
1fe90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fea0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1feb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1fec0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Hdr);.        re
1fed0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1fef0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1ff00 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1ff10 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1ff20 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1ff30 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1ff40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1ff50 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
1ff60 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
1ff70 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1ff80 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
1ff90 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
1ffa0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1ffb0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23 69  ge_counter);..#i
1ffc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ffd0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1ffe0 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74      if( isDirect
1fff0 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
20000 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
20010 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
20020 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61  uf = pPgHdr->pDa
20030 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ta;.      assert
20040 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
20050 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
20060 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
20070 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
20080 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
20090 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
200a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
200b0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
200c0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
200d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
200e0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
200f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
20100 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
20110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
20130 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
20140 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
20150 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
20160 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20170 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4d   int rc;.  if( M
20180 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
20190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
201a0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
201b0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
201c0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
201d0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
201e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
201f0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
20200 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
20210 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
20220 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
20230 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
20240 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
20250 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
20260 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
20270 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
20280 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
20290 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
202a0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
202b0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
202c0 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
202d0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
202e0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
202f0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
20300 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
20310 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
20320 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
20330 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
20340 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
20350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20360 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
20370 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
20380 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
20390 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
203a0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
203b0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
203c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
203d0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
203e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
203f0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
20400 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
20410 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
20420 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
20430 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
20440 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
20450 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
20460 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20470 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
20480 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
20490 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
204a0 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
204b0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
204c0 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
204d0 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
204e0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
204f0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
20500 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
20510 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
20520 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
20530 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
20540 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
20550 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
20560 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
20570 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
20580 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20590 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
205a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
205b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
205c0 74 65 72 2c 20 0a 20 20 69 6e 74 20 6e 6f 53 79  ter, .  int noSy
205d0 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
205e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
205f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20600 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
20610 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
20630 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
20640 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
20650 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
20660 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
20670 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
20680 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
20690 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
206a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
206b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
206c0 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
206d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
206e0 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
206f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
20700 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20710 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
20720 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
20730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20740 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
20750 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
20760 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
20770 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
20780 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
20790 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
207a0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
207b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
207c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
207d0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
207e0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
207f0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
20800 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
20810 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
20820 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
20830 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
20840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
20850 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
20860 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
20870 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
20880 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
20890 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64  gHdr *pPg;..#ifd
208a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
208b0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
208c0 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d    /* The atomic-
208d0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
208e0 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
208f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20  f all of the.   
20900 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72   ** following ar
20910 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20  e true:.    **. 
20920 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66     **    + The f
20930 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
20940 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
20950 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
20960 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c  r.    **      bl
20970 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
20980 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20  e-size, and.    
20990 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d  **    + This com
209a0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
209b0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
209c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
209d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61  .    **    + Exa
209e0 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
209f0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
20a00 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
20a10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
20a20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
20a30 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
20a40 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68   can be used, th
20a50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20a60 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20  ile will never. 
20a70 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64     ** be created
20a80 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
20a90 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
20aa0 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57    int useAtomicW
20ab0 72 69 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20  rite;.    pPg = 
20ac0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
20ad0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
20ae0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65  PCache);.    use
20af0 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
20b00 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
20b10 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
20b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20b30 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
20b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
20b50 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
20b60 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20  Pager) && .     
20b70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
20b80 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e>=pPager->dbFil
20b90 65 53 69 7a 65 20 26 26 20 0a 20 20 20 20 20 20  eSize && .      
20ba0 20 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67    (pPg==0 || pPg
20bb0 2d 3e 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20  ->pDirty==0).   
20bc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20be0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
20bf0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
20c00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
20c10 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65  F );.    if( use
20c20 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
20c30 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
20c40 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
20c50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20c60 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
20c70 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
20c80 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
20c90 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
20ca0 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
20cb0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
20cc0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
20cd0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
20ce0 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
20cf0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
20d00 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
20d10 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
20d20 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
20d30 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
20d40 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
20d50 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
20d60 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
20d70 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
20d80 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
20d90 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
20da0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
20db0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
20dc0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
20dd0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
20de0 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
20df0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
20e00 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
20e10 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
20e20 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
20e30 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
20e40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20e60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
20e70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
20e80 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
20e90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
20ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
20eb0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
20ec0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
20ed0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
20ee0 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72  if( !useAtomicWr
20ef0 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ite && rc==SQLIT
20f00 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20  E_OK ).#endif.. 
20f10 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
20f20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
20f30 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
20f40 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
20f50 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
20f60 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
20f70 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
20f80 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
20f90 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
20fa0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
20fb0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
20fc0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
20fd0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
20fe0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
20ff0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
21000 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
21010 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
21020 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
21030 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
21040 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
21050 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
21060 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
21070 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
21080 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
21090 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
210a0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
210b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
210c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
210d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
210e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28  _exit;.      if(
210f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21100 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
21110 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23  NALMODE_OFF ){.#
21120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21130 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21140 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
21150 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  ->dbSize<pPager-
21160 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
21170 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
21180 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
21190 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
211a0 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
211b0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
211c0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
211d0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
211e0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
211f0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
21200 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
21210 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
21220 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21230 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
21240 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 53 6b          Pgno iSk
21250 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
21260 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
21270 20 20 20 20 20 20 50 67 6e 6f 20 64 62 53 69 7a        Pgno dbSiz
21280 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21290 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ze;.          fo
212a0 72 28 20 69 3d 70 50 61 67 65 72 2d 3e 64 62 53  r( i=pPager->dbS
212b0 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
212c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
212d0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  + ){.           
212e0 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74   if( !sqlite3Bit
212f0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
21300 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26  pInJournal, i) &
21310 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
21320 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21330 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
21340 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
21350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21370 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
21380 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
21390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
213a0 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
213c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
213d0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
213e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
213f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
21400 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
21410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21420 7d 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  } .          pPa
21430 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62  ger->dbSize = db
21440 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
21450 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
21460 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
21470 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
21480 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
21490 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
214a0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
214b0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  xit;.        rc 
214c0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
214d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
214e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
214f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
21500 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69  o sync_exit;..#i
21510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21520 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
21530 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
21540 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 46 69  ize<pPager->dbFi
21550 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
21560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21570 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
21580 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
21590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
215a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
215b0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
215c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
215d0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
215e0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
215f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21600 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
21610 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
21620 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21630 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
21640 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
21650 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
21660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
21680 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
21690 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
216a0 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
216b0 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
216c0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
216d0 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
216e0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
216f0 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
21700 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
21710 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
21720 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
21730 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
21740 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
21750 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
21760 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
21770 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
21780 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
21790 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
217a0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
217b0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
217c0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
217d0 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
217e0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
217f0 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
21800 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
21810 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21820 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21830 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21840 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
21850 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21860 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
21870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21880 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
21890 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
218a0 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
218b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
218c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
218d0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
218e0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
218f0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
21900 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
21910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
21920 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
21930 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
21940 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
21950 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  dbSize<pPager->d
21960 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
21970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21980 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
21990 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
219a0 65 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  e);.  }..sync_ex
219b0 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
219c0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
219d0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
219e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
219f0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
21a00 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
21a10 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
21a20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
21a30 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
21a40 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
21a50 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
21a60 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
21a70 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
21a80 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
21a90 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
21aa0 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
21ab0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
21ac0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
21ad0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
21ae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21af0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
21b00 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
21b10 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
21b20 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
21b30 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
21b40 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
21b50 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
21b60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
21b70 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
21b80 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
21b90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
21ba0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
21bb0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
21bc0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
21bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21be0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
21bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21c00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21c10 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
21c20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
21c30 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
21c40 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
21c50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
21c60 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
21c70 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
21c80 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
21c90 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
21ca0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
21cb0 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
21cc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
21cd0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21ce0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
21cf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
21d00 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
21d10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21d20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
21d30 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
21d40 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
21d50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
21d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50  LITE_OK;.  }.  P
21d70 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
21d80 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
21d90 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73  D(pPager));.  as
21da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21db0 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
21dc0 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
21dd0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
21de0 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  e );.  rc = page
21df0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
21e00 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
21e10 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
21e20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
21e30 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
21e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21e50 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
21e60 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
21e70 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
21e80 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
21e90 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
21ea0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
21eb0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
21ec0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
21ed0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
21ee0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21ef0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
21f00 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
21f10 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
21f20 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
21f30 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
21f40 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
21f50 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
21f60 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
21f70 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
21f80 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
21f90 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
21fa0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
21fb0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
21fc0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
21fd0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
21fe0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
21ff0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
22000 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
22010 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
22020 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
22030 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
22040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22050 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
22060 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
22070 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
22080 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
22090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45  QLITE_OK;.  PAGE
220a0 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
220b0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
220c0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
220d0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
220e0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
220f0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
22100 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
22110 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
22120 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
22130 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
22140 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
22150 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
22160 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
22170 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
22180 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
22190 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
221a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
221b0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
221c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
221d0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
221e0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
221f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22200 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
22210 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
22220 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
22230 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
22240 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
22250 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
22260 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
22270 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
22280 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
22290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
222a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
222b0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
222c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
222d0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
222e0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
222f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
22300 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
22310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
22320 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
22330 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
22340 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
22350 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
22360 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
22370 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
22380 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
22390 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
223a0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
223b0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
223c0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
223d0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
223e0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
223f0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
22400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22420 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
22430 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
22440 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
22450 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
22460 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
22470 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
22480 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
22490 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
224a0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
224b0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
224c0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
224d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
224e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
224f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
22500 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
22510 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
22520 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
22530 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
22540 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
22550 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
22560 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
22570 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
22580 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22590 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
225a0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
225b0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
225c0 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
225d0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
225e0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
225f0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
22600 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
22610 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
22620 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
22630 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
22640 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
22650 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
22660 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
22670 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
22680 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
22690 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
226a0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
226b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
226c0 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
226d0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
226e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
226f0 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
22700 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
22710 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
22720 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
22730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
22740 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
22750 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
22760 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
22770 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
22780 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22790 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
227a0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
227b0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
227c0 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
227d0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
227e0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
227f0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
22800 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
22810 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
22820 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74   return a;.}.int
22830 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
22840 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
22850 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
22860 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  MDB;.}.#endif../
22870 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
22880 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
22890 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
228a0 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 0a  avepoints open..
228b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
228c0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
228d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
228e0 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
228f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22900 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 53  TE_OK;..  if( nS
22910 61 76 65 70 6f 69 6e 74 3e 70 50 61 67 65 72 2d  avepoint>pPager-
22920 3e 6e 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  >nSavepoint && p
22930 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
22940 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  l ){.    int ii;
22950 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
22960 69 6e 74 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20  int *aNew;..    
22970 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 75  /* Either the su
22980 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  b-journal is ope
22990 6e 20 6f 72 20 74 68 65 72 65 20 61 72 65 20 6e  n or there are n
229a0 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
229b0 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  nts. */.    asse
229c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
229d0 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 70 50 61  epoint==0 || pPa
229e0 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68  ger->sjfd->pMeth
229f0 6f 64 73 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ods );..    /* G
22a00 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61 53  row the Pager.aS
22a10 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75  avepoint array u
22a20 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20  sing realloc(). 
22a30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
22a40 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  MEM.    ** if th
22a50 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  e allocation fai
22a60 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ls. Otherwise, z
22a70 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74  ero the new port
22a80 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20  ion in case a . 
22a90 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69     ** malloc fai
22aa0 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
22ab0 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20  e populating it 
22ac0 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20  in the for(...) 
22ad0 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20  loop below..    
22ae0 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50  */.    aNew = (P
22af0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29  agerSavepoint *)
22b00 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
22b10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22b20 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65  aSavepoint, size
22b30 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
22b40 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20  t)*nSavepoint.  
22b50 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e    );.    if( !aN
22b60 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
22b70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
22b80 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
22b90 74 28 26 61 4e 65 77 5b 70 50 61 67 65 72 2d 3e  t(&aNew[pPager->
22ba0 6e 53 61 76 65 70 6f 69 6e 74 5d 2c 20 30 2c 0a  nSavepoint], 0,.
22bb0 20 20 20 20 20 20 20 20 28 6e 53 61 76 65 70 6f          (nSavepo
22bc0 69 6e 74 20 2d 20 70 50 61 67 65 72 2d 3e 6e 53  int - pPager->nS
22bd0 61 76 65 70 6f 69 6e 74 29 20 2a 20 73 69 7a 65  avepoint) * size
22be0 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
22bf0 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 50  t).    );.    pP
22c00 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
22c10 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 69 69 20   = aNew;.    ii 
22c20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  = pPager->nSavep
22c30 6f 69 6e 74 3b 0a 20 20 20 20 70 50 61 67 65 72  oint;.    pPager
22c40 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
22c50 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20  Savepoint;..    
22c60 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
22c70 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73  PagerSavepoint s
22c80 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20 61  tructures just a
22c90 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20  llocated. */.   
22ca0 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f   for(/* no-op */
22cb0 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b  ; ii<nSavepoint;
22cc0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
22cd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
22ce0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
22cf0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
22d00 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  g = pPager->dbSi
22d10 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
22d20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
22d30 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
22d40 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
22d50 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
22d60 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
22d70 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
22d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22d90 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
22da0 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
22db0 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
22dc0 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
22dd0 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
22de0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
22df0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49       aNew[ii].pI
22e00 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c  nSavepoint = sql
22e10 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
22e20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
22e30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65  ;.      if( !aNe
22e40 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
22e50 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  nt ){.        re
22e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22e70 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
22e80 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
22e90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
22ea0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
22eb0 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20  ady opened. */. 
22ec0 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
22ed0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
22ee0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
22f00 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
22f10 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
22f20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
22f30 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
22f40 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
22f50 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
22f60 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
22f70 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
22f80 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
22f90 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
22fa0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
22fb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
22fc0 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
22fd0 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
22fe0 20 68 61 76 65 20 6f 63 63 75 72 65 64 20 73 69   have occured si
22ff0 6e 63 65 20 73 61 76 65 70 6f 69 6e 74 20 69 53  nce savepoint iS
23000 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65  avepoint was cre
23010 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  ated..**.** In e
23020 69 74 68 65 72 20 63 61 73 65 2c 20 61 6c 6c 20  ither case, all 
23030 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20  savepoints with 
23040 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
23050 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74   than iSavepoint
23060 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79   .** are destroy
23070 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23080 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
23090 20 28 69 53 61 76 65 70 6f 69 6e 74 2b 31 29 20   (iSavepoint+1) 
230a0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
230b0 73 20 77 68 65 6e 20 74 68 69 73 20 0a 2a 2a 20  s when this .** 
230c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
230d0 65 64 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ed it is a no-op
230e0 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
230f0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
23100 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23110 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
23120 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
23130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23140 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
23150 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
23160 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
23170 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69  ROLLBACK );..  i
23180 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50  f( iSavepoint<pP
23190 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
231a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
231b0 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 69      int nNew = i
231c0 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d  Savepoint + (op=
231d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
231e0 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  ACK);.    for(ii
231f0 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72  =nNew; ii<pPager
23200 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
23210 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
23220 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
23230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
23240 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
23250 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
23260 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
23270 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20  nt = nNew;..    
23280 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
23290 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 70 50  T_ROLLBACK && pP
232a0 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
232b0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ods ){.      Pag
232c0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
232d0 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
232e0 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
232f0 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
23300 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
23310 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
23320 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
23330 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
23340 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
23350 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
23360 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
23370 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
23380 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
23390 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
233a0 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
233b0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
233c0 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
233d0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
233e0 52 45 4c 45 41 53 45 20 26 26 20 70 50 61 67 65  RELEASE && pPage
233f0 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  r->sjfd->pMethod
23400 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
23410 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
23420 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
23430 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
23440 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
23450 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23460 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
23470 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
23490 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
234a0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
234b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
234c0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
234d0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
234e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
234f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23500 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
23510 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
23520 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
23530 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
23540 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
23550 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
23560 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
23570 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
23580 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
23590 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
235a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
235b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
235c0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
235d0 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
235e0 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
235f0 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
23600 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
23610 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
23620 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
23630 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
23640 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23650 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23660 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
23670 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
23680 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
23690 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
236a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
236b0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
236c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
236d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
236e0 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
236f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
23700 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
23710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23720 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
23730 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
23740 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
23750 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23760 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
23770 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
23780 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
23790 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
237a0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
237b0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
237c0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
237d0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
237e0 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
237f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
23800 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
23810 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
23820 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
23830 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
23840 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
23850 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
23860 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
23870 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23880 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
23890 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
238a0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
238b0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
238c0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
238d0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
238e0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
238f0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
23900 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
23910 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
23920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23930 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
23940 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
23950 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
23960 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
23970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
23980 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
23990 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
239a0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
239b0 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
239c0 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
239d0 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
239e0 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
239f0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
23a00 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
23a10 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
23a20 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
23a30 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
23a40 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
23a50 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
23a60 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
23a70 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
23a80 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
23a90 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
23aa0 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
23ab0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
23ac0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
23ad0 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
23ae0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
23af0 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
23b00 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
23b10 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23b20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
23b30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
23b40 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
23b50 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
23b60 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
23b70 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
23b80 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
23b90 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
23ba0 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
23bb0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
23bc0 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
23bd0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
23be0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
23bf0 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
23c00 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
23c10 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
23c20 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
23c30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
23c40 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20   active)..**.** 
23c50 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  If the fourth ar
23c60 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74  gument, isCommit
23c70 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  , is non-zero, t
23c80 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
23c90 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20   being.** moved 
23ca0 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74  as part of a dat
23cb0 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61  abase reorganiza
23cc0 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65  tion just before
23cd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23ce0 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f   .** is being co
23cf0 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73  mmitted. In this
23d00 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61   case, it is gua
23d10 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
23d20 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a   database page .
23d30 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f  ** pPg refers to
23d40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
23d50 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69  tten to again wi
23d60 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
23d70 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
23d80 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
23d90 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
23da0 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
23db0 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73  gno pgno, int is
23dc0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72  Commit){.  PgHdr
23dd0 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
23de0 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
23df0 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50  rwritten. */.  P
23e00 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
23e10 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
23e20 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
23e30 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
23e40 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
23e50 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
23e60 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
23e70 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23e80 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
23e90 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
23ea0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
23eb0 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  0, pgno);.  IOTR
23ec0 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
23ed0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
23ee0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
23ef0 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
23f00 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20  ontent(pPg);..  
23f10 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
23f20 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
23f30 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
23f40 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
23f50 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
23f60 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
23f70 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
23f80 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
23f90 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
23fa0 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
23fb0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
23fc0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
23fd0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
23fe0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
23ff0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
24000 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
24010 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
24020 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
24030 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
24040 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
24050 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
24060 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
24070 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
24080 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
24090 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
240a0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
240b0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
240c0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
240d0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
240e0 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
240f0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
24100 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
24110 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
24120 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
24130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24140 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
24150 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
24160 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
24170 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
24180 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
24190 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
241a0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
241b0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
241c0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
241d0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
241e0 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
241f0 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
24200 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
24210 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
24220 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
24230 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
24240 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
24250 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
24260 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
24270 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
24280 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
24290 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
242a0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
242b0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
242c0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
242d0 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
242e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
242f0 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  YNC);.  }..  sql
24300 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
24310 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Pg, pgno);.  if(
24320 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73   pPgOld ){.    s
24330 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
24340 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pPgOld);.  }.. 
24350 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
24360 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
24370 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
24380 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  he = 1;.  pPager
24390 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
243a0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
243b0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
243c0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
243d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
243e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
243f0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
24400 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
24410 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
24420 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
24430 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
24440 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
24450 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
24460 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
24470 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
24480 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
24490 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
244a0 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
244b0 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
244c0 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
244d0 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
244e0 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
244f0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
24500 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
24510 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
24520 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
24530 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
24540 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
24550 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
24560 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
24570 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
24580 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
24590 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
245a0 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
245b0 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
245c0 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
245d0 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
245e0 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
245f0 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
24600 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
24610 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
24620 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
24630 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
24640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24650 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
24660 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
24670 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24680 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
24690 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
246a0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
246b0 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
246c0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
246d0 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
246e0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
246f0 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
24700 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
24710 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
24720 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
24730 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
24740 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
24750 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
24760 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
24770 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
24780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24790 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
247a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
247b0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
247c0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
247d0 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
247e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
247f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
24800 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e  >pInJournal && n
24810 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
24820 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
24830 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24840 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
24850 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
24860 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b  , needSyncPgno);
24870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24890 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
248a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
248b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
248c0 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
248d0 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
248e0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
248f0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
24900 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
24910 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
24920 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24930 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
24940 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
24950 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
24960 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24970 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
24980 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
24990 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
249a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
249b0 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
249c0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
249d0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20   pPg->nRef>0 || 
249e0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
249f0 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Db );.  return p
24a00 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
24a10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24a20 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
24a30 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
24a40 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
24a50 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
24a60 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
24a70 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
24a80 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
24a90 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
24aa0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
24ab0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
24ac0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
24ad0 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45   (pPager?pPg->pE
24ae0 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  xtra:0);.}../*.*
24af0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
24b00 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
24b10 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
24b20 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
24b30 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
24b40 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
24b50 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
24b60 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
24b70 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
24b80 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24b90 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
24ba0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
24bb0 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
24bc0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
24bd0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
24be0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
24bf0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
24c00 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
24c10 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
24c20 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
24c30 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
24c40 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
24c50 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
24c60 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
24c70 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
24c80 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
24c90 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
24ca0 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
24cb0 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
24cc0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
24cd0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24ce0 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
24cf0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
24d00 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
24d10 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
24d20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
24d30 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
24d40 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
24d50 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
24d60 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
24d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
24d80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
24d90 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
24da0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
24db0 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
24dc0 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
24dd0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
24de0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
24df0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
24e00 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
24e10 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
24e20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
24e30 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
24e40 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  t/set the journa
24e50 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
24e60 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
24e70 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
24e80 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
24e90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
24ea0 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41  E_QUERY.**    PA
24eb0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24ec0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47  DELETE.**    PAG
24ed0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
24ee0 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41  RUNCATE.**    PA
24ef0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24f00 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41  PERSIST.**    PA
24f10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24f20 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OFF.**.** If the
24f30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
24f40 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74  t _QUERY, then t
24f50 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
24f60 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
24f70 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
24f80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
24f90 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
24fa0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
24fb0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
24fc0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f  journal-mode..*/
24fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24fe0 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  rJournalMode(Pag
24ff0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25000 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d  eMode){.  if( !M
25010 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
25020 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
25030 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
25040 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
25050 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
25060 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
25070 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ETE.            
25080 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
25090 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
250a0 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20  UNCATE.         
250b0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
250c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
250d0 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20  _PERSIST.       
250e0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
250f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
25100 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
25110 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
25120 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
25130 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
25140 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
25150 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
25160 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  0 );.    if( eMo
25170 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  de>=0 ){.      p
25180 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25190 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
251a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
251b0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
251c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
251d0 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 20 20 7d  E_QUERY );.    }
251e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
251f0 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
25200 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
25210 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a   Get/set the siz
25220 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72  e-limit used for
25230 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
25240 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36  nal files..*/.i6
25250 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
25260 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
25270 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
25280 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
25290 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
252a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
252b0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
252c0 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
252d0 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
252e0 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
252f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25300 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.