/ Hex Artifact Content
Login

Artifact ef93fb79ab794a0109784a2018f23127c53dd74a:


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 31  : pager.c,v 1.51
0350: 33 20 32 30 30 38 2f 31 32 2f 31 30 20 32 31 3a  3 2008/12/10 21:
0360: 31 39 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a  19:57 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
03f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0400: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0410: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0430: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0440: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0450: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0460: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
0470: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0480: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
0490: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04a0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04b0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04c0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
04d0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
04e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04f0: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0500: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0510: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0520: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0530: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0540: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0550: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0560: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
0590: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05a0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05c0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
05d0: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
05e0: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
05f0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0600: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0610: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0620: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0630: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0640: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0650: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0660: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
0670: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
0680: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
0690: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06a0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06b0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06c0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
06d0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06e0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
06f0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0700: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0710: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0720: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0730: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0740: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0750: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0760: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0770: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0780: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0790: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07a0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07b0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07e0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
07f0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0810: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0820: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0830: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0860: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0870: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0880: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0890: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08c0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08d0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0900: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0910: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0920: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0930: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0940: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0960: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0970: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0980: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
0990: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09b0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09c0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09d0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09e0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a10: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a20: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a30: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a70: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a90: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0aa0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ab0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ac0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0ae0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0af0: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b00: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b10: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b40: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b50: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b60: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b70: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0b90: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0ba0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bb0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0be0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0bf0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c00: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c10: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c20: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c30: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c50: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c60: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c70: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0ca0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cb0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0ce0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0cf0: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d00: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0d70: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0d80: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0d90: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0da0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0db0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0dc0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0dd0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0de0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0df0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e00: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e10: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e20: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e30: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e40: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e50: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e60: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0e70: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0e80: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0e90: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ea0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0eb0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ec0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ed0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0ee0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ef0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f00: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f10: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f20: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f30: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f40: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f50: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f60: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0f70: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0f80: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0f90: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fa0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fb0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0fc0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
0fd0: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
0fe0: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
0ff0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1000: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1020: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1030: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1040: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1050: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1060: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
1070: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
1080: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
1090: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10a0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10b0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10c0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
10d0: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
10e0: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
10f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1100: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1110: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1120: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1130: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1140: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1150: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1160: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
1170: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
1180: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
1190: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11a0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11c0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
11d0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
11e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
11f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1200: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1210: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1220: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1230: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1240: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1250: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1260: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1270: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
1280: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
1290: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12a0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12b0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12c0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
12d0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12e0: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
12f0: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1300: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1310: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1320: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1330: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1340: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1350: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1360: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1370: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1380: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
1390: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13a0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13b0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13c0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
13d0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13e0: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
13f0: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1400: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1410: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1420: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1430: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1440: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1450: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1460: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
1470: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
1480: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
1490: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14a0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14b0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
14d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
14e0: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
14f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1510: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1520: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1530: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1540: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1550: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1560: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
1570: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
1580: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
1590: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15a0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15b0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15c0: 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  )&~7)../*.** A m
15d0: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
15e0: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
15f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1600: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1610: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1620: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1630: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1640: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1650: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1660: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
1670: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
1680: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
1690: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
16a0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
16b0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
16d0: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
16e0: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
16f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1700: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1710: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1720: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1730: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1740: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1750: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
1760: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
1770: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
1780: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
1790: 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51  UPT, or.** or SQ
17a0: 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20  LITE_FULL. Once 
17b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  one of the first
17c0: 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63   three errors oc
17d0: 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74  curs, it persist
17e0: 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75  s.** and is retu
17f0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
1800: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
1810: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
1820: 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
1830: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
1840: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
1850: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
1860: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
1870: 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63  the.** next succ
1880: 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20  essful rollback 
1890: 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  is performed on 
18a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
18b0: 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45   Also,.** SQLITE
18c0: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
18d0: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
18e0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
18f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1900: 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68  up().** APIs, th
1910: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
1920: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
1930: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  y..*/.struct Pag
1940: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
1950: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
1960: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
1970: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
1980: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1990: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
19a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
19b0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19c0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
19d0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
19e0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
19f0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
1a00: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
1a10: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
1a20: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
1a40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a50: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
1a60: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
1a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a80: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1a90: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
1aa0: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
1ab0: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
1ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ad0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1ae0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
1af0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
1b00: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
1b10: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
1b20: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
1b30: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
1b50: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
1b60: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
1b70: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
1b80: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
1b90: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
1bc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
1bd0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
1be0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
1bf0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
1c00: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
1c10: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
1c20: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
1c30: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
1c40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1c50: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
1c60: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
1c70: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
1c90: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
1ca0: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
1cb0: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
1cc0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
1cd0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1ce0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
1cf0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
1d00: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d20: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
1d30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
1d40: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d60: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
1d70: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
1d80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1d90: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1db0: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
1dc0: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
1dd0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1de0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1df0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
1e00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
1e10: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
1e20: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
1e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e40: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
1e50: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
1e60: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
1e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e80: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
1e90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1ea0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
1eb0: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1ed0: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
1ee0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
1ef0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
1f00: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
1f20: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
1f40: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
1f50: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
1f60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
1f70: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
1f80: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
1f90: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
1fa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1fb0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
1fc0: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
1fd0: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
1fe0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
1ff0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
2000: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
2010: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
2020: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
2030: 20 64 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20   dbSizeValid;   
2040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
2050: 20 77 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20   when dbSize is 
2060: 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20 75 33 32  correct */.  u32
2070: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
2080: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2090: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
20a0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
20b0: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
20c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
20d0: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
20e0: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
20f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2110: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2120: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
2130: 20 20 50 67 6e 6f 20 6f 72 69 67 44 62 53 69 7a    Pgno origDbSiz
2140: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2150: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
2160: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
2170: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 73 74 6d 74  e */.  Pgno stmt
2180: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2190: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
21a0: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
21b0: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
21c0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21f0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
2200: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2210: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2230: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
2240: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
2250: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
2260: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2280: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
2290: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
22a0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
22b0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
22c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
22d0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
22e0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
22f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
2300: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
2310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2320: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
2330: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
2340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2350: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2360: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2370: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  pages */.  int m
2380: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2390: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23a0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
23b0: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
23c0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
23d0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
23e0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
23f0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
2400: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2410: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
2420: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
2430: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2440: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2450: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2460: 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b  Bitvec *pInStmt;
2470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2480: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2490: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
24a0: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
24b0: 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63   *pAlwaysRollbac
24c0: 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74  k;    /* One bit
24d0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 6d   for each page m
24e0: 61 72 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f 6c  arked always-rol
24f0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  lback */.  char 
2500: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
2510: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2520: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2530: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2540: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2550: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2560: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
2580: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
2590: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
25a0: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
25b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
25c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
25d0: 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20   *fd, *jfd;     
25e0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
25f0: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
2600: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
2610: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2620: 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  stfd;         /*
2630: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2640: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
2650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
2660: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
2670: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
2680: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
2690: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
26a0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
26b0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
26c0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
26d0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
26e0: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  r */.  i64 journ
26f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
2700: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2710: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
2720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2730: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
2740: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2750: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
2760: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
2770: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
2780: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
27a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
27b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
27c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
27d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
27e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
27f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
2800: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
2810: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
2820: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2830: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
2840: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
2850: 67 69 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  gin() */.  u32 s
2860: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
2870: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
2880: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
2890: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
28a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
28c0: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
28d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
28e0: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
28f0: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
2900: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
2910: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2920: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
2930: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
2940: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
2950: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
2960: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2970: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2990: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
29a0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
29b0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
29c0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
29d0: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
29e0: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
29f0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
2a00: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
2a10: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
2a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
2a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
2a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
2a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
2a70: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
2a80: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
2a90: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
2aa0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
2ab0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
2ac0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2ad0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
2ae0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
2af0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
2b00: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
2b10: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
2b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2b30: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
2b40: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
2b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
2b60: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
2b70: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
2b80: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
2b90: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
2ba0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
2bb0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
2bc0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
2bd0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
2be0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
2bf0: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
2c00: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
2c10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2c20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2c30: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
2c40: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
2c50: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
2c60: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
2c70: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2c80: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
2c90: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
2ca0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
2cb0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
2cc0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2cd0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
2ce0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
2cf0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2d00: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
2d10: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2d20: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
2d30: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
2d40: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
2d50: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2d60: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2d70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2d80: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2d90: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2da0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2db0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
2dc0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
2dd0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
2de0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
2df0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
2e00: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
2e10: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
2e20: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2e30: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
2e40: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
2e50: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
2e60: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
2e70: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2e80: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2e90: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2ea0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
2eb0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
2ec0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2ed0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2ee0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2ef0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2f00: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2f10: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
2f20: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
2f30: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
2f40: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
2f50: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
2f60: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
2f70: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2f80: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2f90: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2fa0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2fb0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2fc0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
2fd0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2fe0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2ff0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
3000: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
3010: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
3020: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
3030: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
3040: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
3050: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3060: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3070: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3080: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3090: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
30a0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
30b0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
30c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
30d0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
30e0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
30f0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3100: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3110: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
3120: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
3130: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
3140: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3150: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3160: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3170: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3180: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3190: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
31a0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
31b0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
31c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31d0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
31e0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
31f0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3200: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3210: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
3220: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
3230: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
3240: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
3250: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
3260: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
3270: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3280: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3290: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
32a0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
32b0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
32c0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
32d0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
32e0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
32f0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3300: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
3310: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
3320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
3330: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
3340: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
3350: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
3360: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
3370: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
3380: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
3390: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
33a0: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
33b0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
33c0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
33d0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
33e0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
33f0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
3400: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
3410: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
3420: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
3430: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
3440: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
3450: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
3460: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
3470: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
3480: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
3490: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
34a0: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
34b0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
34c0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
34d0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
34e0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
34f0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
3500: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
3510: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
3520: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
3530: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
3540: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
3550: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
3560: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
3570: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
3580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
3590: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
35a0: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
35b0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
35c0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
35d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
35e0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
35f0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3600: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3610: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3620: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3630: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3640: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3650: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3660: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3680: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3690: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
36a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
36b0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
36c0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
36d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
36e0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
36f0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3700: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3710: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3720: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3730: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3740: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3750: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3760: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3770: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3780: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3790: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
37a0: 28 28 50 67 6e 6f 29 28 28 50 45 4e 44 49 4e 47  ((Pgno)((PENDING
37b0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
37c0: 53 69 7a 65 29 29 2b 31 29 29 0a 0a 2f 2a 0a 2a  Size))+1))../*.*
37d0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
37e0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
37f0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
3800: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3810: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
3820: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  647../*.** Retur
3830: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
3840: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
3850: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3860: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
3870: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
3880: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
3890: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
38a0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
38b0: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
38c0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
38d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
38e0: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
38f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
3900: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
3910: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
3920: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
3930: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
3940: 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
3950: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3960: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
3970: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
3980: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
3990: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
39a0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
39b0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
39c0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
39d0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
39e0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
39f0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
3a00: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
3a10: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
3a20: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
3a30: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
3a40: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
3a50: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
3a60: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
3a70: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
3a80: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
3a90: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
3aa0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
3ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
3ac0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
3ad0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
3ae0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
3af0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
3b00: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
3b10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3b20: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
3b30: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
3b40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3b50: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
3b60: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
3b70: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
3b80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3b90: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3ba0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
3bb0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
3bc0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
3bd0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
3be0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
3bf0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
3c00: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
3c10: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
3c20: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
3c30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
3c40: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
3c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
3c60: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
3c70: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
3c80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3c90: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
3ca0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
3cb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
3cc0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
3cd0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
3ce0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
3cf0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
3d00: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
3d10: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
3d20: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
3d30: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
3d40: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
3d50: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
3d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3d70: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
3d80: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
3d90: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
3da0: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
3db0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3dc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
3dd0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
3de0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
3df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3e00: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
3e10: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
3e20: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
3e30: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
3e40: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
3e50: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
3e60: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
3e70: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
3e80: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
3e90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
3ea0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
3eb0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
3ec0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
3ed0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
3ee0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
3ef0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
3f00: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
3f10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3f20: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
3f30: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
3f40: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
3f50: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
3f60: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
3f70: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
3f80: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
3f90: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
3fa0: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
3fb0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
3fc0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
3fd0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3fe0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
3ff0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
4000: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
4010: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
4020: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4030: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
4040: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
4050: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
4060: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
4070: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
4080: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
4090: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
40a0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
40b0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
40c0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  */.  int szPage;
40d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
40e0: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
40f0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
4100: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
4110: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
4120: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
4130: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
4140: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
4150: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
4160: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
4170: 64 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  d);.    szPage =
4180: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
4190: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
41a0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
41b0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
41c0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
41d0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
41e0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
41f0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
4200: 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20  ethods || .     
4210: 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f    (dc & (SQLITE_
4220: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
4230: 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65  Page>>8)) && nSe
4240: 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b  ctor<=szPage) ){
4250: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
4280: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
4290: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
42a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
42b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
42c0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
42d0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
42e0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
42f0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
4300: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
4310: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4320: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
4330: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
4340: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
4350: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
4360: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
4370: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
4380: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
4390: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
43a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
43b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
43c0: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
43d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
43e0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
43f0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
4400: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
4410: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
4420: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
4430: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
4440: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
4450: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
4460: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
4470: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
4480: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
4490: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
44a0: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
44b0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
44c0: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
44d0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
44e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
44f0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
4500: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
4510: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
4520: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
4530: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
4540: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
4550: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4560: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
4570: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
4580: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
4590: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
45a0: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
45b0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
45c0: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
45d0: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
45e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
45f0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
4600: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
4610: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4620: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4630: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4640: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4650: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
4660: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
4670: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4680: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
4690: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
46a0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
46b0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
46c0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
46d0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
46e0: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
46f0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4700: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4710: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4720: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
4730: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
4740: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
4750: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4760: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
4770: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
4780: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
4790: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
47a0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
47b0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
47c0: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
47d0: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
47e0: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
47f0: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
4800: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
4810: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
4820: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
4830: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
4840: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
4850: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
4860: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
4870: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4890: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
48a0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
48b0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
48c0: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
48d0: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
48e0: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
48f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
4900: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4910: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
4920: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
4940: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
4950: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
4960: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
4970: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
4980: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
4990: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
49a0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
49b0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
49c0: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
49d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
49e0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
49f0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4a00: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
4a10: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
4a20: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
4a30: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
4a40: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
4a50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
4a60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
4a70: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
4a80: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
4a90: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
4aa0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
4ab0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
4ac0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4ad0: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
4ae0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
4af0: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
4b10: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
4b20: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
4b30: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
4b40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4b50: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
4b60: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
4b70: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
4b80: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
4b90: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
4ba0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
4bb0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
4bc0: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
4bd0: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
4be0: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
4bf0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
4c00: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
4c10: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
4c20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
4c30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
4c40: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
4c50: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
4c60: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
4c70: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
4c80: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
4c90: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
4ca0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
4cb0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
4cc0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
4cd0: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
4ce0: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
4cf0: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
4d00: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
4d10: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
4d20: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
4d30: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
4d40: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
4d50: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
4d60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
4d70: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
4d80: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
4d90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4da0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
4db0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
4dc0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
4dd0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
4de0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
4df0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
4e00: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
4e10: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
4e20: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
4e30: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
4e40: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
4e50: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
4e60: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
4e70: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
4e80: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
4e90: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
4ea0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
4eb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
4ec0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
4ed0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
4ee0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
4ef0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
4f00: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
4f10: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
4f20: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
4f30: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
4f40: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
4f50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4f60: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
4f70: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
4f80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
4f90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4fa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4fb0: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
4fc0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
4fd0: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
4fe0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
4ff0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5000: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5010: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5020: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5030: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5040: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5050: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5060: 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75  2 cksum;.  u32 u
5070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5080: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
5090: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
50a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
50b0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
50c0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
50d0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
50e0: 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d  */..  zMaster[0]
50f0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d   = '\0';..  rc =
5100: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5110: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
5120: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5130: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5140: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5150: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5160: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
5170: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5180: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5190: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e  n rc;..  if( len
51a0: 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  >=nMaster ){.   
51b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
51c0: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  K;.  }..  rc = r
51d0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
51e0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
51f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5200: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5210: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5220: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5230: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
5240: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5250: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
5260: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5270: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5280: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5290: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
52a0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
52b0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
52c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
52d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
52e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  n rc;.  }.  zMas
52f0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
5300: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
5310: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
5320: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
5330: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
5340: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
5350: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
5360: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
5370: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5380: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5390: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
53a0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
53b0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
53c0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
53d0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
53e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
53f0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
5400: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
5410: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
5420: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
5430: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5440: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5450: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5460: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5470: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5480: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
5490: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  r[0] = '\0';.  }
54a0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
54b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
54c0: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
54d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
54e0: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
54f0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
5500: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
5510: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
5520: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
5530: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
5540: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5550: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5560: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5570: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5580: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5590: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
55b0: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 65  .static void see
5680: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5690: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
56a0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
56b0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
56c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
56d0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
56e0: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
56f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5700: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5710: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5720: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5730: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5740: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5760: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5770: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5780: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5790: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
57a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
57b0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
57c0: 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65   Write zeros ove
57d0: 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  r the header of 
57e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
57f0: 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
5800: 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76  ** effect of inv
5810: 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f  alidating the jo
5820: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63  urnal file and c
5830: 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a  ommitting the.**
5840: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
5850: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
5860: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5870: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
5880: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
5890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
58a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
58b0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
58c0: 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70   = {0};..  if( p
58d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
58e0: 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69  f ){.    i64 iLi
58f0: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
5900: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
5910: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
5920: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
5930: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
5940: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
5950: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
5960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
5970: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
5980: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
5990: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
59a0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
59b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
59c0: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
59d0: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
59e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
59f0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
5a00: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
5a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5a20: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
5a30: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
5a40: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
5a50: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
5a60: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
5a70: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
5a80: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
5a90: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
5aa0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
5ab0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
5ac0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
5ad0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
5ae0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
5af0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
5b00: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
5b10: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
5b20: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
5b30: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
5b40: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
5b50: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
5b60: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
5b70: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
5b80: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
5b90: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
5ba0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
5bb0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
5bc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5bd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
5be0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
5bf0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
5c00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
5c10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
5c20: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
5c30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5c40: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
5c50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5c60: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
5c70: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
5c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5c90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5cb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5cc0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5cd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5ce0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5cf0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5d00: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5d10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5d20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d30: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5d40: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5d50: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5d60: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5d70: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5d80: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5d90: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5da0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5db0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5dc0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5dd0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5de0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5df0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5e00: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5e10: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5e20: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5e30: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5e40: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5e50: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5e60: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5e70: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5e80: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5e90: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
5ea0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
5eb0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
5ec0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
5ed0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5ee0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
5ef0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
5f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
5f10: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
5f20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
5f30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5f40: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  ;.  char *zHeade
5f50: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
5f60: 53 70 61 63 65 3b 0a 20 20 75 33 32 20 6e 48 65  Space;.  u32 nHe
5f70: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
5f80: 61 67 65 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  ageSize;.  u32 n
5f90: 57 72 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48  Write;..  if( nH
5fa0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
5fb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
5fc0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
5fd0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5fe0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
5ff0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
6000: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
6010: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
6020: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6030: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65  alOff;.  }..  se
6040: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6050: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
6060: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
6070: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6080: 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  ..  memcpy(zHead
6090: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
60a0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
60b0: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a  alMagic));..  /*
60c0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
60d0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
60e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
60f0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
6100: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
6110: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
6120: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
6130: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
6140: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
6150: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
6160: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
6170: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
6180: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
6190: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
61a0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
61b0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
61c0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
61d0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
61e0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
61f0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
6200: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
6210: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
6220: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
6230: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
6240: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
6250: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
6260: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
6270: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
6280: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
6290: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
62a0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
62b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
62c0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
62d0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
62e0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
62f0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
6300: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
6310: 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
6320: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
6330: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
6340: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
6350: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
6360: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
6370: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
6380: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
6390: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
63a0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
63b0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
63c0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
63d0: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
63e0: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
63f0: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
6400: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
6410: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
6420: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
6430: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
6440: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
6450: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
6460: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
6470: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
6480: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
6490: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
64a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50    */.  assert(pP
64b0: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
64c0: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ds||pPager->noSy
64d0: 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  nc);.  if( (pPag
64e0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
64f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
6500: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
6510: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
6520: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
6530: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
6540: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
6550: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
6560: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
6570: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
6580: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6590: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
65a0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
65b0: 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62  else{.    put32b
65c0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
65d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
65e0: 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  c)], 0);.  }..  
65f0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
6600: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
6610: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
6620: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
6630: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
6640: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
6650: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6660: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6670: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6680: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
6690: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
66a0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
66b0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
66c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
66d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
66e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
66f0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
6700: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6710: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6720: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6730: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6740: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6760: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
6770: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  orSize);..  /* I
6780: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
6790: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
67a0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
67b0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
67c0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
67d0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
67e0: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
67f0: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
6800: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
6810: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
6820: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
6830: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
6840: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
6850: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
6860: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
6870: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
6880: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6890: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
68a0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
68b0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
68c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
68d0: 29 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  ));..  if( pPage
68e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30  r->journalHdr==0
68f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
6900: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
6910: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6920: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6930: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
6940: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
6950: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69  .  }..  for(nWri
6960: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
6970: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
6980: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6990: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
69a0: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
69b0: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
69c0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
69d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
69e0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
69f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6a00: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
6a10: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
6a20: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
6a30: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50  rnalOff);.    pP
6a40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a50: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
6a60: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6a70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6a80: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6a90: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6aa0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6ac0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
6ad0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
6ae0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
6af0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
6b00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
6b10: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
6b20: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
6b30: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
6b40: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6b50: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6b60: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6b70: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6b80: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6b90: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6ba0: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6bb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6bc0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
6bd0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
6be0: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
6bf0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
6c00: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
6c10: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
6c20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
6c30: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
6c40: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6c50: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6c60: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6c70: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6c80: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6c90: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6ca0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6cc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
6cd0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
6ce0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
6cf0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
6d00: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
6d10: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
6d20: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6d30: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6d40: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6d50: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6d60: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6d70: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6d80: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6d90: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6da0: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6db0: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6dc0: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
6dd0: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
6de0: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
6df0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
6e00: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
6e10: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6e20: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6e30: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
6e40: 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67  lOff;.  int iPag
6e50: 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f  eSize;..  seekJo
6e60: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6e70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6e80: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6ea0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6ec0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
6ed0: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
6ee0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
6ef0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6f00: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6f10: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6f20: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
6f30: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
6f40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
6f50: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
6f60: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
6f70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
6f80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6f90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
6fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6fb0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6fc0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6fd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6fe0: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
6ff0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7000: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
7010: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7020: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
7030: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
7040: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
7050: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7060: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7070: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7080: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
7090: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
70a0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
70b0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
70c0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36  >jfd, jrnlOff+16
70d0: 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53  , (u32 *)&iPageS
70e0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
70f0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
7100: 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   iPageSize>=512 
7110: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
7120: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
7130: 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28  E_SIZE .   && ((
7140: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
7150: 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b  geSize)==0 .  ){
7160: 0a 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a  .    u16 pagesiz
7170: 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20  e = iPageSize;. 
7180: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
7190: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
71a0: 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a  pPager, &pagesiz
71b0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
71e0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
71f0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
7200: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
7210: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
7220: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
7230: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
7240: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7250: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7260: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7270: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7280: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7290: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
72a0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
72b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
72c0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
72d0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
72e0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
72f0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
7300: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
7310: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
7320: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7330: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7340: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 73 65 63  12, &pPager->sec
7350: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
7360: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7370: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
7380: 65 63 74 6f 72 53 69 7a 65 20 26 20 28 70 50 61  ectorSize & (pPa
7390: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2d  ger->sectorSize-
73a0: 31 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  1))!=0.         
73b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  || pPager->secto
73c0: 72 53 69 7a 65 3e 30 78 31 30 30 30 30 30 30 20  rSize>0x1000000 
73d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
73e0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
73f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7400: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
7410: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
7420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7430: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
7440: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
7450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7460: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
7470: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7480: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
7490: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
74a0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
74b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
74c0: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
74d0: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
74e0: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
74f0: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
7500: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
7510: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
7520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
7530: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
7540: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
7550: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
7560: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
7570: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
7580: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
7590: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
75a0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
75b0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
75c0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
75d0: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
75e0: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
75f0: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
7600: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
7610: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
7620: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
7630: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
7640: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
7650: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
7660: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
7670: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
7680: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
7690: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
76a0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
76b0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
76c0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
76d0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
76e0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
76f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
7700: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
7710: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
7720: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
7730: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
7740: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7750: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
7760: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
7770: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
7780: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7790: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
77a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
77b0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
77c0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
77d0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
77e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
77f0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
7800: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7810: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7820: 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e 20  MEMORY ) return 
7830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
7840: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
7850: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c   1;..  len = sql
7860: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
7870: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
7880: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
7890: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
78a0: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
78b0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
78c0: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
78d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
78e0: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
78f0: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
7900: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7910: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
7920: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
7930: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
7940: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
7950: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
7960: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
7970: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
7980: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73  ullSync ){.    s
7990: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
79a0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e  ager);.  }.  jrn
79b0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
79c0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
79d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
79e0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
79f0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
7a00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
7a10: 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  nlOff, PAGER_MJ_
7a20: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
7a30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7a40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7a50: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a    jrnlOff += 4;.
7a60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7a70: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7a80: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
7a90: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
7aa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7ab0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
7ac0: 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a  rnlOff += len;..
7ad0: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
7ae0: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
7af0: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
7b00: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
7b10: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
7b20: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7b30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
7b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7b50: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7b60: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
7b70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7b80: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72  , jrnlOff);.  jr
7b90: 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f  nlOff += 8+sizeo
7ba0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7bb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
7bc0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
7bd0: 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66  noSync;..  /* If
7be0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
7bf0: 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
7c00: 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
7c10: 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
7c20: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
7c30: 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
7c40: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
7c50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
7c60: 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
7c70: 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
7c80: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
7c90: 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
7ca0: 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
7cb0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
7cc0: 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
7cd0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
7ce0: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
7cf0: 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
7d00: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7d10: 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
7d20: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
7d30: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
7d40: 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
7d50: 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
7d60: 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
7d70: 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
7d80: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
7d90: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
7da0: 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
7db0: 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
7dc0: 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
7dd0: 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63 20  E_OK).   && (rc 
7de0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
7df0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
7e00: 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51   &jrnlSize))==SQ
7e10: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72  LITE_OK.   && jr
7e20: 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20  nlSize>jrnlOff. 
7e30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7e40: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
7e50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
7e60: 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
7e70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7e80: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7e90: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7ea0: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7eb0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7ec0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7ed0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7ee0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7ef0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7f00: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7f10: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7f20: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7f30: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
7f40: 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
7f50: 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
7f60: 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
7f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
7f80: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
7f90: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
7fa0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
7fb0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
7fc0: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
7fd0: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
7fe0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
7ff0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
8000: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
8010: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
8020: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
8030: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
8040: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
8050: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
8060: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
8070: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8080: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
8090: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
80a0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
80b0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
80c0: 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
80d0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
80e0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
80f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8100: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
8110: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
8120: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
8130: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
8140: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
8150: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
8160: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
8170: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
8180: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
8190: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
81a0: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
81b0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
81c0: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
81d0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
81e0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
81f0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
8200: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
8210: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
8220: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
8230: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
8240: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
8250: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
8260: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
8270: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
8280: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
8290: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f  {.    int rc = o
82a0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
82b0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
82c0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65    if( rc ) pPage
82d0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
82e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
82f0: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
8300: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
8310: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
8320: 29 29 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  ))..    /* Alway
8330: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
8340: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
8350: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
8360: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a  ase lock..    **
8370: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74   Otherwise, anot
8380: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
8390: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
83a0: 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20  =delete might.  
83b0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
83c0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
83d0: 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
83e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
83f0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
8400: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8410: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
8420: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8430: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
8440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
8450: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
8460: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
8470: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49        pPager->pI
8480: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8490: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
84a0: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
84b0: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
84c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
84d0: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
84e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
84f0: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
8500: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
8510: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
8520: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
8530: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
8540: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
8550: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
8560: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
8570: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
8580: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
8590: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
85a0: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
85b0: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
85c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
85d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
85e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
85f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61  =SQLITE_OK ) pPa
8600: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
8610: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
8620: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
8630: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
8640: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8650: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8660: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
8670: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20  ->stfd);.       
8680: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8690: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
86a0: 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  nStmt);.        
86b0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
86c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
86d0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
86e0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  pen = 0;.      p
86f0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
8700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8710: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8720: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8730: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8750: 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
8760: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8770: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8780: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0;.    }..    p
8790: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
87a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
87b0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
87c0: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
87d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
87e0: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
87f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
8800: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
8810: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
8820: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
8830: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
8840: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
8850: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
8860: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
8870: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
8880: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8890: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
88a0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
88b0: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d   if( p->errCode=
88c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
88d0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
88e0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
88f0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
8900: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
8910: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
8920: 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ck(p);.    sqlit
8930: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
8940: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
8950: 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f  _unlock(p);.}../
8960: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8970: 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
8980: 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63  tion.  A transac
8990: 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79  tion is ended by
89a0: 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d   either.** a COM
89b0: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
89c0: 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  K..**.** When th
89d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
89e0: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
89f0: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
8a00: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
8a10: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
8a20: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
8a30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
8a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
8a50: 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65  l release.** the
8a60: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
8a70: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
8a80: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
8a90: 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69   place if that i
8aa0: 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  s.** the appropr
8ab0: 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f  iate thing to do
8ac0: 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73  .  Release locks
8ad0: 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72   usually is appr
8ae0: 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65  opriate,.** unle
8af0: 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63  ss we are in exc
8b00: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
8b10: 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69  de or unless thi
8b20: 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49  s is a .** COMMI
8b30: 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52  T AND BEGIN or R
8b40: 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49  OLLBACK AND BEGI
8b50: 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  N operation..**.
8b60: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
8b70: 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65  ile is either de
8b80: 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74  leted or truncat
8b90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
8ba0: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
8bb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8bc0: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
8bd0: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
8be0: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
8bf0: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
8c00: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
8c10: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
8c20: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
8c30: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
8c40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
8c50: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
8c60: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
8c70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
8c80: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
8c90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8ca0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
8cb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
8cc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
8cd0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
8ce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8cf0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
8d00: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
8d10: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
8d20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
8d30: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
8d40: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
8d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8d60: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
8d70: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
8d80: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
8d90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8da0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
8db0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8dc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
8dd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
8de0: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
8df0: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
8e00: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
8e10: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
8e20: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
8e30: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
8e40: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
8e50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8e60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
8e70: 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61   !isMemoryJourna
8e80: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
8e90: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
8ea0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
8eb0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8ec0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
8ed0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
8ee0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8ef0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8f00: 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
8f10: 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
8f20: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8f30: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29  pPager->jfd, 0))
8f40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8f50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8f60: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
8f70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8f80: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
8f90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
8fa0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8fb0: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
8fc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8fd0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8fe0: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
8ff0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
9000: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
9010: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
9020: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
9030: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
9040: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9050: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
9060: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9070: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
9080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
90a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
90b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
90c0: 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20  ELETE || rc );. 
90d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
90e0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
90f0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9100: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
9110: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
9120: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
9130: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
9140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9150: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
9160: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
9170: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
9180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9190: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
91a0: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
91b0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
91c0: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
91d0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  rnal = 0;.    sq
91e0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
91f0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  oy(pPager->pAlwa
9200: 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ysRollback);.   
9210: 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73   pPager->pAlways
9220: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
9230: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9240: 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69  K_PAGES.    sqli
9250: 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
9260: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9270: 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
9280: 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64  _pagehash);.#end
9290: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  if.    sqlite3Pc
92a0: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
92b0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
92c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
92d0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
92e0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
92f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9300: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
9310: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
9320: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
9330: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
9340: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
9350: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
9360: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
9370: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9380: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
9390: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
93a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
93b0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
93c0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
93d0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
93e0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
93f0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
9400: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9410: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
9420: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9430: 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73 74 53 65  ;.  /* lruListSe
9440: 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
9450: 67 65 72 29 3b 20 2a 2f 0a 20 20 69 66 28 20 21  ger); */.  if( !
9460: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
9470: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
9480: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
9490: 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
94a0: 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
94b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
94c0: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  :rc);.}../*.** C
94d0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
94e0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
94f0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
9500: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
9510: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
9520: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
9530: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
9540: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
9550: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
9560: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
9570: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
9580: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
9590: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
95a0: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
95b0: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
95c0: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
95d0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
95e0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
95f0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
9600: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
9610: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
9620: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
9630: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
9640: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
9650: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
9660: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
9670: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
9680: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
9690: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
96a0: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
96b0: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
96c0: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
96d0: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
96e0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
96f0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
9700: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
9710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
9720: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
9730: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
9740: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
9750: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
9760: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
9770: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
9780: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
9790: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
97a0: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
97b0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
97c0: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
97d0: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
97e0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
97f0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
9800: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
9810: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
9820: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
9830: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
9840: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
9850: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
9860: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
9870: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
9880: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
9890: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
98a0: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
98b0: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
98c0: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
98d0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
98e0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
98f0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
9900: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
9910: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
9920: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
9930: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
9940: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
9950: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
9960: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
9970: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
9980: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
9990: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
99a0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
99b0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
99c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
99d0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
99e0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
99f0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
9a00: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
9a10: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
9a20: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
9a30: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
9a40: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
9a50: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
9a60: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
9a70: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
9a80: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
9a90: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
9aa0: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
9ab0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
9ac0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  es not..*/.stati
9ad0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
9ae0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
9af0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
9b00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9b10: 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
9b20: 62 61 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  back */.  sqlite
9b30: 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 20 20 20 2f  3_file *jfd,   /
9b40: 2a 20 54 68 65 20 66 69 6c 65 20 74 68 61 74 20  * The file that 
9b50: 69 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  is the journal b
9b60: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
9b70: 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74   */.  i64 offset
9b80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ,          /* Of
9b90: 66 73 65 74 20 6f 66 20 74 68 65 20 70 61 67 65  fset of the page
9ba0: 20 77 69 74 68 69 6e 20 74 68 65 20 6a 6f 75 72   within the jour
9bb0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  nal */.  int isM
9bc0: 61 69 6e 4a 72 6e 6c 20 20 20 20 20 20 20 2f 2a  ainJrnl       /*
9bd0: 20 54 72 75 65 20 66 6f 72 20 6d 61 69 6e 20 72   True for main r
9be0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9bf0: 20 46 61 6c 73 65 20 66 6f 72 20 53 74 6d 74 20   False for Stmt 
9c00: 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  jrnl */.){.  int
9c10: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
9c20: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
9c30: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
9c40: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
9c50: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
9c60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
9c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9c80: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
9c90: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
9ca0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
9cd0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
9ce0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
9cf0: 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29   *aData = (u8 *)
9d00: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
9d10: 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  e;   /* Temp sto
9d20: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
9d30: 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d 61 69 6e 4a  */..  /* isMainJ
9d40: 72 6e 6c 20 73 68 6f 75 6c 64 20 62 65 20 74 72  rnl should be tr
9d50: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
9d60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
9d70: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
9d80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
9d90: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
9da0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
9db0: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
9dc0: 74 28 20 6a 66 64 20 3d 3d 20 28 69 73 4d 61 69  t( jfd == (isMai
9dd0: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
9de0: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9df0: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9e00: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9e10: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9e20: 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  , offset, &pgno)
9e30: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9e40: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9e50: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
9e60: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
9e70: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9e80: 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
9e90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9ea0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
9eb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9ec0: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
9ed0: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
9ee0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
9ef0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
9f00: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
9f10: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
9f20: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
9f30: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
9f40: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
9f50: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
9f60: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
9f70: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
9f80: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
9f90: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
9fa0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
9fb0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
9fc0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
9fd0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
9fe0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
9ff0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
a000: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
a010: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
a020: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
a030: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
a040: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a050: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
a060: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
a070: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
a080: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a090: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
a0a0: 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
a0b0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
a0c0: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
a0d0: 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t+pPager->pageSi
a0e0: 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ze+4, &cksum);. 
a0f0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a100: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
a110: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a120: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
a130: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
a140: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
a150: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a160: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
a170: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
a180: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
a190: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
a1a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
a1b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
a1c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
a1d0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
a1e0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
a1f0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
a200: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
a210: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
a220: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
a230: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
a240: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
a250: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
a260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a270: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
a280: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
a290: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
a2a0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
a2b0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
a2c0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
a2d0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
a2e0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
a2f0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
a300: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
a310: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
a320: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
a330: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
a340: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
a350: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
a360: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
a370: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
a380: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
a390: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
a3a0: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
a3b0: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
a3c0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
a3d0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
a3e0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
a3f0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
a400: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
a410: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
a420: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
a430: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
a440: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
a450: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
a460: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
a470: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
a480: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
a490: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
a4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
a4b0: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
a4c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
a4d0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
a4e0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
a4f0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
a500: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
a510: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
a520: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
a530: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
a540: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
a550: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
a560: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
a570: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
a580: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
a590: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
a5a0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
a5b0: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
a5c0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
a5d0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
a5e0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
a5f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
a600: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
a610: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
a620: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
a630: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
a640: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
a650: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
a660: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
a670: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
a680: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
a690: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
a6a0: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
a6b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
a6c0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
a6d0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
a6e0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
a6f0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
a700: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
a710: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
a720: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
a730: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
a740: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
a750: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
a760: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
a770: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
a780: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
a790: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
a7a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
a7b0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
a7c0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
a7d0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
a7e0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
a7f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
a800: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
a810: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
a820: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
a830: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
a840: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
a850: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
a860: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
a870: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
a880: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
a890: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
a8a0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
a8b0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
a8c0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
a8d0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
a8e0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
a8f0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
a900: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
a910: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
a920: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
a930: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
a940: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
a950: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
a960: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
a970: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a980: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
a990: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
a9a0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
a9b0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
a9c0: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
a9d0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
a9e0: 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20  XCLUSIVE).   && 
a9f0: 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
aa00: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
aa10: 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26  NEED_SYNC)).   &
aa20: 26 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  & (pPager->fd->p
aa30: 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a 20 20  Methods).  ){.  
aa40: 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67    i64 ofst = (pg
aa50: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
aa60: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
aa70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
aa80: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
aa90: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
aaa0: 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
aab0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
aac0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
aad0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
aae0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
aaf0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
ab00: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
ab10: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
ab20: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
ab30: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
ab40: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
ab50: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
ab60: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
ab70: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
ab80: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
ab90: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
aba0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
abb0: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
abc0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
abd0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
abe0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
abf0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
ac00: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
ac10: 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
ac20: 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
ac30: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
ac40: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
ac50: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
ac60: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
ac70: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
ac80: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
ac90: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Pg);.    }.    i
aca0: 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
acb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
acc0: 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
acd0: 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
ace0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
acf0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
ad00: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
ad10: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
ad20: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
ad30: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
ad40: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
ad50: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
ad60: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
ad70: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
ad80: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
ad90: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
ada0: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
adb0: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
adc0: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
add0: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
ade0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
adf0: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
ae00: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
ae10: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
ae20: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
ae30: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
ae40: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
ae50: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  3);.    sqlite3P
ae60: 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
ae70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ae80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
ae90: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
aea0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
aeb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
aec0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
aed0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
aee0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
aef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
af00: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
af10: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
af20: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
af30: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
af40: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
af50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
af60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
af70: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
af80: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
af90: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
afa0: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
afb0: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
afc0: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
afd0: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
afe0: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
aff0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
b000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
b010: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
b020: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
b030: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
b040: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
b050: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
b060: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
b070: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
b080: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
b090: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
b0a0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
b0b0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
b0c0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
b0d0: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
b0e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
b0f0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
b100: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
b110: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
b120: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
b130: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
b140: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
b150: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
b160: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
b170: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
b180: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
b190: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
b1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
b1b0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
b1c0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
b1d0: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
b1e0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
b1f0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
b200: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b210: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
b220: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
b230: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
b240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b250: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
b260: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b270: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
b280: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
b290: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
b2a0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
b2b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
b2c0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
b2d0: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
b2e0: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
b2f0: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
b300: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
b310: 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f  Malloc(pVfs->szO
b320: 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
b330: 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
b340: 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
b350: 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
b360: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
b370: 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
b380: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b390: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
b3a0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
b3b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
b3c0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
b3d0: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
b3e0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
b3f0: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
b400: 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
b410: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
b420: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b430: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
b440: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
b450: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  er_open = 1;..  
b460: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b470: 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
b480: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
b490: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b4a0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
b4b0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
b4c0: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
b4d0: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
b4e0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
b4f0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
b500: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
b510: 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72  sterPtr = pPager
b520: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
b530: 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
b540: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
b550: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b560: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
b570: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
b580: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
b590: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
b5a0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
b5b0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
b5c0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
b5d0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
b5e0: 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  3Malloc(nMasterJ
b5f0: 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
b600: 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  Ptr);.    if( !z
b610: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
b620: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
b630: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
b640: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b650: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
b660: 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
b670: 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
b680: 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20  erJournal];.    
b690: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b6a0: 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
b6b0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
b6c0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
b6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b6e0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
b6f0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
b700: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
b710: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
b720: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
b730: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
b740: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
b750: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69  ){.      int exi
b760: 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sts;.      rc = 
b770: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
b780: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
b790: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
b7a0: 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
b7b0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b7c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b7d0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
b7e0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
b7f0: 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20       if( exists 
b800: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
b810: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b820: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
b830: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b840: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
b850: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
b860: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
b870: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
b880: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
b890: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
b8a0: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
b8b0: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
b8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
b8d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b8e0: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
b8f0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
b900: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
b910: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
b920: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
b930: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b940: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
b950: 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
b960: 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
b970: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b990: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
b9a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
b9b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
b9c0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
b9d0: 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
b9e0: 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
b9f0: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
ba00: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
ba10: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
ba20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ba30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
ba40: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
ba50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
ba60: 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
ba70: 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
ba80: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
ba90: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
baa0: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
bab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
bac0: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
bad0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
bae0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
baf0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
bb00: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bb10: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
bb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
bb30: 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
bb40: 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
bb50: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
bb60: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
bb70: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
bb80: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
bb90: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
bba0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
bbb0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
bbc0: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
bbd0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
bbe0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
bbf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
bc00: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
bc10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
bc20: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
bc30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
bc40: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
bc50: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
bc60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
bc70: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
bc80: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
bc90: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
bca0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
bcb0: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
bcc0: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
bcd0: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
bce0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
bcf0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
bd00: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
bd10: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
bd20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
bd30: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
bd40: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
bd50: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
bd60: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
bd70: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
bd80: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
bd90: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
bda0: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
bdb0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
bdc0: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
bdd0: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
bde0: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
bdf0: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
be00: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
be10: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
be20: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
be30: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
be40: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
be50: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
be60: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
be70: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
be80: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
be90: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
bea0: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
beb0: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
bec0: 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
bed0: 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74  e zero byte to t
bee0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
bef0: 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  w.** file instea
bf00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
bf10: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
bf20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bf30: 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
bf40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bf50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
bf60: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
bf70: 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72  LUSIVE && pPager
bf80: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
bf90: 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
bfa0: 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
bfb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bfc0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
bfd0: 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
bfe0: 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
bff0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c000: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
c010: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c020: 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
c030: 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
c040: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
c050: 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
c060: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c070: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
c080: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
c090: 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
c0a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c0b0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
c0c0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
c0d0: 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
c0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c0f0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c100: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
c110: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
c120: 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
c130: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
c140: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
c150: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c160: 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53   Set the sectorS
c170: 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ize for the give
c180: 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  n pager..**.** T
c190: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
c1a0: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69  s at least as bi
c1b0: 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20  g as the sector 
c1c0: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
c1d0: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
c1e0: 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20  torSize().  The 
c1f0: 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73  minimum sector s
c200: 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73  ize is 512..*/.s
c210: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
c220: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
c230: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c240: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
c250: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
c260: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
c270: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
c280: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
c290: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
c2a0: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
c2b0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
c2c0: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
c2d0: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
c2e0: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
c2f0: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
c300: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
c310: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
c320: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
c330: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
c340: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
c350: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
c360: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
c370: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
c380: 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
c390: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
c3a0: 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
c3b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
c3c0: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
c3d0: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
c3e0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
c3f0: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
c400: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
c410: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
c420: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
c430: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
c440: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
c450: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
c460: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
c470: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
c480: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
c490: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
c4a0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
c4b0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
c4c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c4d0: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
c4e0: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
c4f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
c500: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
c510: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
c520: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
c530: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
c540: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
c550: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
c560: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
c570: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
c580: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c590: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
c5a0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
c5b0: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
c5c0: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
c5d0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
c5e0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
c5f0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
c600: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
c610: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
c620: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
c630: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
c640: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c650: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c660: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
c670: 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
c680: 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
c690: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c6a0: 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
c6b0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c6c0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c6d0: 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
c6e0: 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
c6f0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c700: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c710: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
c720: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
c730: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
c740: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
c750: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
c760: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
c770: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
c780: 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
c790: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
c7a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
c7b0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
c7c0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
c7d0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
c7e0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
c7f0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
c800: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
c810: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
c820: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
c830: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
c840: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
c850: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
c860: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
c870: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
c880: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
c890: 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
c8a0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
c8b0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
c8c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
c8d0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
c8e0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
c8f0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
c900: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
c910: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
c920: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
c930: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
c940: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
c950: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
c960: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
c970: 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
c980: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
c990: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c9a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
c9b0: 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
c9c0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
c9d0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
c9e0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
c9f0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
ca00: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
ca10: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
ca20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
ca30: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
ca40: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
ca50: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
ca60: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
ca70: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ca80: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
ca90: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
caa0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
cab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
cac0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
cad0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
cae0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
caf0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
cb00: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
cb10: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
cb20: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
cb30: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
cb40: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
cb50: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
cb60: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
cb70: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
cb80: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
cb90: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
cba0: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
cbb0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
cbc0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
cbd0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
cbe0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
cbf0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
cc00: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
cc10: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
cc20: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
cc30: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
cc40: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
cc50: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
cc60: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
cc70: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
cc80: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
cc90: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
cca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
ccb0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
ccc0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
ccd0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
cce0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
ccf0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
cd00: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
cd10: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
cd20: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
cd30: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
cd40: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
cd50: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
cd60: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
cd70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cd80: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
cd90: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
cda0: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
cdb0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
cdc0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
cdd0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
cde0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
cdf0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
ce00: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
ce10: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
ce20: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
ce30: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
ce40: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
ce50: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
ce60: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
ce70: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
ce80: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
ce90: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
cea0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
ceb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
cec0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
ced0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
cee0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
cef0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cf00: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
cf10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
cf20: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
cf30: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
cf40: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
cf50: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
cf60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cf70: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
cf80: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
cf90: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfb0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cfc0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
cfd0: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cff0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
d000: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
d010: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
d020: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d030: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
d040: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
d050: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
d070: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
d080: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
d090: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
d0a0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
d0b0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
d0c0: 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
d0d0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
d0e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
d0f0: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
d100: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
d110: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
d120: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
d130: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
d140: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
d150: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
d160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
d170: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
d180: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
d190: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
d1a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d1b0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
d1c0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
d1d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
d1e0: 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
d1f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
d210: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d220: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
d230: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
d240: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
d250: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d260: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d270: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
d280: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
d290: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
d2a0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
d2b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
d2c0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
d2d0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
d2e0: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
d2f0: 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
d300: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
d310: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
d320: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
d330: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
d340: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
d350: 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
d360: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d370: 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
d380: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d390: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
d3a0: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
d3b0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
d3c0: 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
d3d0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
d3e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
d3f0: 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
d400: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d410: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
d420: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
d430: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
d440: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
d450: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
d460: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
d470: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
d480: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
d490: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
d4a0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
d4b0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
d4c0: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
d4d0: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
d4f0: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
d500: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
d510: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
d520: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
d530: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
d540: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
d550: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
d560: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
d570: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
d580: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
d590: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
d5a0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
d5b0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d5c0: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
d5d0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
d5e0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
d5f0: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
d600: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
d610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
d620: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d630: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
d640: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
d650: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
d660: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
d670: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
d680: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
d690: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
d6a0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
d6b0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
d6c0: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
d6d0: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
d6e0: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
d6f0: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
d700: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
d710: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
d720: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
d730: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
d740: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
d750: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
d760: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
d770: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
d780: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
d790: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
d7a0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
d7b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d7c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
d7d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d7e0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
d7f0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
d800: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d810: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
d820: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
d830: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
d840: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
d850: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
d860: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
d870: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
d880: 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
d890: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
d8a0: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d8b0: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
d8c0: 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
d8d0: 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
d8e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
d8f0: 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
d900: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
d910: 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
d920: 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
d930: 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
d940: 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
d950: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
d960: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
d970: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
d980: 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
d990: 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
d9a0: 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
d9b0: 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
d9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
d9d0: 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
d9e0: 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
d9f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
da00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
da10: 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
da20: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
da30: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
da40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da50: 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
da60: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
da70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
da80: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
da90: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
daa0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
dab0: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
dac0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
dad0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
dae0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
daf0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
db00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
db10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
db20: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
db30: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
db40: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
db50: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
db60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
db70: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
db80: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
db90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
dba0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
dbb0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
dbc0: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
dbd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
dbe0: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
dbf0: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
dc00: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; u++){.      rc
dc10: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
dc20: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
dc30: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
dc40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dc50: 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ff, 1);.      if
dc60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
dc80: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
dc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
dca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
dcb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
dcc0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
dcd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
dce0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
dd00: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
dd10: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
dd20: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dd30: 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20  probably.       
dd40: 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65     ** going to e
dd50: 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72  nd up being corr
dd60: 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72  upt.  It is corr
dd70: 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f  upt to us, anyho
dd80: 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  w..          ** 
dd90: 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
dda0: 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
ddb0: 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69   along can fix i
ddc0: 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20  t.....          
ddd0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
dde0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ddf0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
de00: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
de10: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
de20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
de30: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
de40: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
de50: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
de60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
de70: 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
de80: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
de90: 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
dea0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
deb0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
dec0: 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
ded0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
dee0: 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +1);.  }.  if( r
def0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
df00: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
df10: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
df20: 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
df30: 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20  ]!='\0');.  }.  
df40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
df50: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
df60: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
df70: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
df80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
df90: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
dfa0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
dfb0: 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
dfc0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
dfd0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
dfe0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
dff0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e000: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
e010: 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
e020: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
e030: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
e040: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
e050: 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
e060: 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
e070: 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
e080: 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
e090: 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
e0a0: 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
e0b0: 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
e0c0: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
e0d0: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
e0e0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
e0f0: 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
e100: 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
e110: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e120: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
e130: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e140: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
e150: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
e160: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
e170: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e180: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
e190: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
e1a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
e1b0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
e1c0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
e1d0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
e1e0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
e1f0: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
e200: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
e210: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
e220: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
e230: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
e240: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
e250: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
e260: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
e270: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
e280: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
e290: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
e2a0: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
e2b0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
e2c0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
e2d0: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
e2e0: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
e2f0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
e300: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
e310: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
e320: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e330: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
e340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e350: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
e360: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
e370: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
e380: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
e390: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
e3a0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
e3b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e3c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e3d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
e3e0: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
e3f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
e400: 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
e410: 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
e420: 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
e430: 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
e440: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
e450: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
e460: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
e470: 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
e480: 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
e490: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
e4a0: 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
e4b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
e4c0: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
e4d0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
e4e0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
e4f0: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
e500: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
e510: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
e520: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
e530: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
e540: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
e550: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
e560: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
e570: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
e580: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
e590: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
e5a0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
e5b0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e5c0: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
e5d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
e5e0: 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
e5f0: 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
e600: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
e610: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
e620: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
e630: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
e640: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
e650: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
e660: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
e670: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
e680: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
e690: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
e6a0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
e6b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
e6c0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
e6d0: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
e6e0: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
e6f0: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
e700: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
e710: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
e720: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
e730: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
e740: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
e750: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
e760: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
e770: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
e780: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
e790: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  c; i++){.    i64
e7a0: 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70   offset = i*(4+p
e7b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e7c0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
e7d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
e7e0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
e7f0: 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
e800: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
e810: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
e820: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
e830: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
e840: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
e850: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
e860: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
e870: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
e880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
e890: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
e8a0: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
e8b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
e8c0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
e8d0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
e8e0: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
e8f0: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
e900: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
e910: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
e920: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
e930: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
e940: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
e950: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
e960: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
e970: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
e980: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
e990: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
e9a0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
e9b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
e9c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
e9d0: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
e9e0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
e9f0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50  ction..  */.  pP
ea00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ea10: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
ea20: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
ea30: 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
ea40: 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
ea50: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
ea60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72  journalOff < hdr
ea70: 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Off ){.    rc = 
ea80: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
ea90: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
eaa0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
eab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
eac0: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
ead0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
eae0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
eaf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
eb00: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
eb10: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
eb20: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
eb30: 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
eb40: 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
eb50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
eb60: 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
eb70: 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
eb80: 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
eb90: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
eba0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
ebb0: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
ebc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ebd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ebe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
ebf0: 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
ec00: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
ec10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ec20: 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
ec30: 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
ec40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec50: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
ec60: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
ec70: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
ec80: 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
ec90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
eca0: 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
ecb0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
ecc0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
ecd0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
ece0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
ecf0: 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
ed00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ed10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ed20: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ed30: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
ed40: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
ed50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
ed60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ed70: 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
ed80: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
ed90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
eda0: 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
edb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
edc0: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
edd0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
ede0: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
edf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ee00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
ee10: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
ee20: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
ee30: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
ee40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ee50: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
ee60: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
ee70: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
ee80: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
ee90: 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
eea0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
eeb0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
eec0: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
eed0: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
eee0: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
eef0: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
ef00: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
ef10: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
ef20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
ef30: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
ef40: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
ef50: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
ef60: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
ef70: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
ef80: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
ef90: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
efa0: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
efb0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
efc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
efd0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
efe0: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
eff0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
f000: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
f010: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
f020: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
f030: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
f050: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
f060: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
f070: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
f080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f090: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
f0a0: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
f0b0: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
f0c0: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
f0d0: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
f0e0: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
f0f0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
f100: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
f120: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
f130: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
f140: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
f150: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
f160: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
f170: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
f180: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
f190: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
f1a0: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
f1b0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
f1c0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
f1d0: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
f1e0: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
f1f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
f200: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
f210: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f220: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f230: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
f240: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
f250: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
f260: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
f270: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
f280: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
f2a0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
f2b0: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
f2c0: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
f2d0: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
f2e0: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
f2f0: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
f300: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
f310: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
f330: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
f340: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
f350: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
f360: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
f370: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
f380: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
f390: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
f3a0: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
f3b0: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
f3e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
f3f0: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
f400: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f410: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
f420: 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
f430: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
f440: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
f450: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
f460: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f470: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
f480: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f490: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
f4a0: 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
f4b0: 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
f4c0: 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
f4d0: 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
f4e0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f4f0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
f500: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
f510: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
f520: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
f530: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
f540: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
f550: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
f560: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
f570: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
f580: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
f590: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
f5a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
f5b0: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
f5c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f5d0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
f5e0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
f5f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
f600: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
f610: 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
f620: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
f630: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
f640: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
f650: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
f660: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
f670: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
f680: 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
f690: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
f6a0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
f6b0: 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
f6c0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
f6d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f6e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f6f0: 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
f700: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
f710: 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
f720: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
f730: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
f740: 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
f750: 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
f760: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
f770: 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
f780: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
f790: 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
f7a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
f7b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f7c0: 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
f7d0: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
f7e0: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
f7f0: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
f800: 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
f810: 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
f820: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f830: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
f840: 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
f850: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f860: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
f870: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
f880: 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
f890: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
f8a0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
f8b0: 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
f8c0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
f8d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
f8e0: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
f8f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f900: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
f910: 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
f920: 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a  *,PgHdr *);../*.
f930: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
f940: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
f950: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
f960: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
f970: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
f980: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
f990: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
f9a0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
f9b0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
f9c0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
f9d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
f9e0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
f9f0: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
fa00: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
fa10: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
fa20: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
fa30: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
fa40: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
fa50: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
fa60: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
fa70: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
fa80: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
fa90: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
faa0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
fab0: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
fac0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
fad0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
fae0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
faf0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
fb00: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
fb10: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
fb20: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
fb30: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
fb40: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
fb50: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
fb60: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
fb70: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
fb80: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
fb90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
fba0: 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
fbb0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
fbc0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
fbd0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
fbe0: 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
fbf0: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
fc00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
fc10: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
fc20: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
fc30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
fc40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
fc50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
fc60: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
fc70: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
fc80: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
fc90: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
fca0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
fcb0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
fcc0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
fcd0: 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
fce0: 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
fcf0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
fd00: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
fd10: 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
fd20: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
fd30: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
fd40: 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
fd50: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
fd60: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
fd70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fd80: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
fd90: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
fda0: 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
fdb0: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
fdc0: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
fdd0: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
fde0: 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
fdf0: 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
fe00: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
fe10: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
fe20: 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
fe30: 46 69 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  FileSize;.  int 
fe40: 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
fe50: 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
fe60: 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66  ;.  int szPageDf
fe70: 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
fe80: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
fe90: 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
fea0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74   = 0;.  int nPat
feb0: 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  hname = 0;..  if
fec0: 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
fed0: 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
fee0: 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
fef0: 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
ff00: 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
ff10: 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
ff20: 56 66 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Vfs);.  }else{. 
ff30: 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
ff40: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a  ze = sqlite3MemJ
ff50: 6f 75 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20  ournalSize();.  
ff60: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  }..  /* The defa
ff70: 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20 61 20  ult return is a 
ff80: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  NULL pointer */.
ff90: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
ffa0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
ffb0: 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
ffc0: 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
ffd0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
ffe0: 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
fff0: 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
10000 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
10010 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
10020 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10030 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
10040 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
10050 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
10060 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
10070 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
10080 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
10090 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
100a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
100b0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
100c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50  sqlite3Malloc(nP
100d0 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
100e0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
100f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10100 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10110 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10120 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10130 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
10140 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
10150 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
10160 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
10170 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
10180 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a   = 0;.    }else.
10190 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
101a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
101b0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
101c0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
101d0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
101e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
101f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10200 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10210 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
10220 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
10230 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   rc;.    }.    n
10240 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
10250 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
10260 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
10270 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
10280 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73   for the pager s
10290 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50  tructure */.  pP
102a0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61  ager = sqlite3Ma
102b0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69  llocZero(.    si
102c0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
102d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
102e0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
102f0 20 20 20 20 70 63 61 63 68 65 53 69 7a 65 20 20      pcacheSize  
10300 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 20 20      +           
10310 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
10320 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
10330 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20  ileSize +       
10340 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
10350 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  al file structur
10360 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e  e */ .    pVfs->
10370 73 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20  szOsFile  +     
10380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
10390 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
103a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
103b0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20   * 2 +       /* 
103c0 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
103d0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a  files */ .    3*
103e0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20  nPathname + 40  
103f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
10400 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
10410 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  ry, zJournal */.
10420 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67    );.  if( !pPag
10430 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
10440 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
10450 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10460 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10470 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
10480 65 20 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70  e = (PCache *)&p
10490 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72  Pager[1];.  pPtr
104a0 20 3d 20 28 28 75 38 20 2a 29 26 70 50 61 67 65   = ((u8 *)&pPage
104b0 72 5b 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69  r[1]) + pcacheSi
104c0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  ze;.  pPager->vf
104d0 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
104e0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  s;.  pPager->fd 
104f0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
10500 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
10510 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67  sFile*0];.  pPag
10520 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69  er->stfd = (sqli
10530 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
10540 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b  pVfs->szOsFile];
10550 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
10560 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10570 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
10580 46 69 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  File+journalFile
10590 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
105a0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
105b0 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  ar*)&pPtr[pVfs->
105c0 73 7a 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e  szOsFile+2*journ
105d0 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
105e0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
105f0 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
10600 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
10610 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
10620 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
10630 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50  r->zDirectory[nP
10640 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
10650 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
10660 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  s;.  if( zPathna
10670 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  me ){.    memcpy
10680 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
10690 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
106a0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
106b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
106c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  athname);.  }.. 
106d0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
106e0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
106f0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10700 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
10710 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
10720 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56  f( nPathname>(pV
10730 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d  fs->mxPathname -
10740 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 22 2d 6a   (int)sizeof("-j
10750 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
10760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10770 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
10780 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
10790 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
107a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
107b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
107c0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
107d0 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
107f0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
10800 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
10810 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
10820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10830 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
10840 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
10850 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
10860 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
10870 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
10880 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
10890 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
108a0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
108b0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
108c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
108d0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
108e0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
108f0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
10900 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10910 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
10920 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
10930 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
10940 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
10950 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
10960 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
10970 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
10980 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
10990 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
109a0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
109b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
109c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
109d0 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
109e0 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
109f0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
10a00 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
10a10 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10a20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
10a30 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
10a40 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
10a50 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53 69  Dflt = iSectorSi
10a60 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
10a70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10a80 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
10a90 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
10aa0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
10ab0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
10ac0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
10ad0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10ae0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
10af0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
10b00 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
10b10 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
10b20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
10b30 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
10b40 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
10b50 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
10b60 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
10b70 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
10b80 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
10b90 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
10ba0 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
10bb0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
10bc0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
10bd0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
10be0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
10bf0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
10c00 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65  ii>>8)) ) szPage
10c10 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
10c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
10c30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
10c40 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53  if( szPageDflt>S
10c50 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
10c60 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
10c70 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
10c80 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
10c90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10ca0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
10cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
10cc0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
10cd0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10ce0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
10cf0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
10d00 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
10d10 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10d20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
10d30 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
10d40 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
10d50 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
10d60 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
10d70 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
10d80 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
10d90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
10da0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
10db0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
10dc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
10dd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
10de0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
10df0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
10e00 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
10e10 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
10e20 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
10e30 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
10e40 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
10e50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
10e60 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
10e70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
10e80 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
10e90 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
10ea0 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
10eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ec0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10ed0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10ee0 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c  Malloc(szPageDfl
10ef0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
10f00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
10f10 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
10f20 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
10f30 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
10f40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
10f50 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
10f60 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
10f70 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
10f80 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
10f90 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
10fa0 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
10fb0 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
10fc0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
10fd0 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
10fe0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
10ff0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11000 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
11010 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11020 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
11030 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
11040 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
11050 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45  EM:rc);.  }.  nE
11060 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
11070 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
11080 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
11090 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
110a0 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
110d0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
110e0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
110f0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
11100 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
11110 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
11120 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
11130 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
11140 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
11150 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
11160 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
11170 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
11180 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
11190 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
111a0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
111b0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
111c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
111d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
111e0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
111f0 33 53 74 72 6c 65 6e 33 30 28 70 50 61 67 65 72  3Strlen30(pPager
11200 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 0a  ->zDirectory); .
11210 20 20 20 20 20 20 69 3e 30 20 26 26 20 70 50 61        i>0 && pPa
11220 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
11230 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
11240 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
11250 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
11260 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
11270 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
11280 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69  Journal[] */.  i
11290 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
112a0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
112b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
112c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
112d0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
112e0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
112f0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
11300 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
11310 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   9);.  }else{.  
11320 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
11330 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  al = 0;.  }..  /
11340 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
11350 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
11360 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11370 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b  al = useJournal;
11380 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
11390 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
113a0 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
113b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
113c0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
113d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
113e0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
113f0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
11400 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11410 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 6d  >dbSizeValid = m
11420 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
11430 70 61 67 65 53 69 7a 65 20 3d 20 73 7a 50 61 67  pageSize = szPag
11440 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67  eDflt;.  /* pPag
11450 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
11460 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11470 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
11480 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11490 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
114a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
114b0 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
114c0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
114d0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
114e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
114f0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
11500 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
11510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
11520 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
11530 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
11540 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
11550 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
11560 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
11570 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11580 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61   = tempFile;.  a
11590 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
115a0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
115b0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
115c0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
115d0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
115e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
115f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11600 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
11610 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
11620 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11630 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  Mode = tempFile;
11640 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   .  pPager->memD
11650 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  b = memDb;.  pPa
11660 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
11670 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
11680 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
11690 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
116a0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
116b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
116c0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
116d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
116e0 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
116f0 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
11700 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
11710 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11720 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
11730 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
11740 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
11750 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
11760 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
11770 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
11780 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
11790 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
117a0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
117b0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
117c0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
117d0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70  IMIT;.  assert(p
117e0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
117f0 6f 64 73 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a  ods||tempFile);.
11800 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
11810 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d  pPager);.  if( m
11820 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
11830 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
11840 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
11850 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
11860 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
11870 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
11880 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
11890 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
118a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
118b0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
118c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
118d0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
118e0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
118f0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
11900 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11910 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
11920 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
11930 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11940 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
11950 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
11960 61 67 65 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78  ager, .  int (*x
11970 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
11980 64 20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42  d *),.  void *pB
11990 75 73 79 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b  usyHandlerArg.){
119a0 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
119b0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
119c0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
119d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
119e0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
119f0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
11a00 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
11a10 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
11a20 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
11a30 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
11a40 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
11a50 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
11a60 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
11a70 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
11a80 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11a90 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
11aa0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
11ab0 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
11ac0 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
11ad0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
11ae0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
11af0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
11b00 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
11b10 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
11b20 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
11b30 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
11b40 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
11b50 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
11b60 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
11b70 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20  it)(DbPage*)){. 
11b80 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
11b90 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
11ba0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
11bb0 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61  age size to *pPa
11bc0 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73  geSize. If the s
11bd0 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20  uggest new page 
11be0 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70  size is.** inapp
11bf0 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
11c00 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
11c10 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
11c20 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20  o that.** value 
11c30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
11c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11c60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11c70 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b  u16 *pPageSize){
11c80 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
11c90 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
11ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11cb0 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
11cc0 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
11cd0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
11ce0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
11cf0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11d00 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
11d10 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
11d20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  );.    if( pageS
11d30 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
11d40 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
11d50 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
11d60 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
11d70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
11d80 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
11d90 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
11da0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11db0 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
11dc0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
11dd0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
11de0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
11df0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
11e00 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
11e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11e20 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
11e30 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
11e40 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
11e50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
11e60 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
11e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
11e80 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73  Pager->memDb ) s
11e90 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11ea0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
11eb0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
11ec0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
11ed0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
11ee0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
11ef0 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ew;.        sqli
11f00 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
11f10 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
11f20 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
11f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f40 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20     *pPageSize = 
11f50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11f60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11f80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11f90 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
11fa0 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
11fb0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
11fc0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
11fd0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
11fe0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
11ff0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
12000 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
12010 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
12020 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
12030 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
12040 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
12050 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
12060 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
12070 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
12080 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
12090 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
120a0 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
120b0 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
120c0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
120d0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
120e0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
120f0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
12100 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12110 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
12120 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
12130 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
12140 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
12150 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
12160 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
12170 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
12180 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
12190 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
121a0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
121b0 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
121c0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
121d0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
121e0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
121f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12200 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
12210 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
12220 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
12230 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
12240 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12250 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
12260 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
12270 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
12280 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
12290 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
122a0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
122b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
122c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
122d0 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
122e0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
122f0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12300 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
12310 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
12320 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
12330 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
12340 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
12350 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
12360 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
12370 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
12380 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
12390 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
123a0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
123b0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
123c0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
123d0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
123e0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
123f0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
12400 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
12410 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
12420 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
12430 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
12440 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
12450 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12460 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
12470 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
12480 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
12490 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
124a0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
124b0 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
124c0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
124d0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
124e0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
124f0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
12500 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12510 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
12520 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
12530 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
12540 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
12550 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
12560 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12570 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
12580 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
12590 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
125a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
125b0 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
125c0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
125d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
125e0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
125f0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
12600 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20  s to. .**.** No 
12610 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69  error checking i
12620 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69  s done. The rati
12630 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73  onal for this is
12640 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
12650 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63  ion .** may be c
12660 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68  alled even if th
12670 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
12680 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
12690 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a   a header. In .*
126a0 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71  * these cases sq
126b0 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69  lite3OsRead() wi
126c0 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ll return an err
126d0 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65  or, to which the
126e0 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73   correct .** res
126f0 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f  ponse is to zero
12700 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70   the memory at p
12710 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  Dest and continu
12720 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72  e.  A real IO er
12730 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65  ror .** will pre
12740 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e  sumably recur an
12750 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c  d be picked up l
12760 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e  ater (Todo: Thin
12770 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a  k about this)..*
12780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12790 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
127a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
127b0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
127c0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
127d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
127e0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
127f0 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
12800 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
12810 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
12820 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
12830 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
12840 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
12850 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
12860 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
12870 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
12880 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
12890 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
128a0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
128b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
128c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
128d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
128e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
128f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12910 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
12920 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
12930 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
12940 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
12950 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
12960 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
12970 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
12980 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
12990 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
129a0 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
129b0 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
129c0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
129d0 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
129e0 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
129f0 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
12a00 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
12a10 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
12a20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
12a30 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
12a40 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
12a50 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
12a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12a70 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
12a80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12a90 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 36  t *pnPage){.  i6
12aa0 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 n = 0;.  int r
12ab0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
12ac0 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
12ad0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
12af0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
12b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12b10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
12b20 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
12b30 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
12b40 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
12b50 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
12b60 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
12b70 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
12b80 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  e);.    if( (pPa
12b90 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
12ba0 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d  s).     && (rc =
12bb0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
12bc0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
12bd0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
12be0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
12bf0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
12c00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
12c30 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
12c40 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
12c50 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
12c60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
12c90 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
12ca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
12cb0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 20 20 70  ize = n;.      p
12cc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
12cd0 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  id = 1;.    }.  
12ce0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
12cf0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
12d00 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
12d10 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
12d20 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
12d30 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12d40 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
12d50 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
12d60 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
12d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12d80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12d90 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
12da0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
12db0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12dc0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
12dd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12de0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
12df0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
12e00 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
12e10 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
12e20 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
12e30 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
12e40 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
12e50 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
12e60 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
12e70 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
12e80 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
12e90 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
12ea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12eb0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
12ec0 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
12ed0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
12ee0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
12ef0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
12f00 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
12f10 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
12f20 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
12f30 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
12f40 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
12f50 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
12f60 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
12f70 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
12f80 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
12f90 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
12fa0 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
12fb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12fc0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12fd0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12fe0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
12ff0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13000 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13010 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
13020 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
13030 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
13040 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
13050 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
13060 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
13070 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
13080 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
13090 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
130a0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
130b0 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
130c0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
130d0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
130e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
130f0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
13100 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
13110 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
13120 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
13130 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13140 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
13150 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13160 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
13170 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
13180 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
13190 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
131a0 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
131b0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
131c0 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
131d0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
131e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
131f0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
13200 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
13210 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
13220 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
13230 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
13240 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
13250 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
13260 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
13270 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
13280 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
13290 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
132a0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
132b0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
132c0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  =0 );..  if( pPa
132d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
132e0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
132f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
13300 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
13310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13320 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
13330 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
13340 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
13350 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
13360 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
13370 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
13380 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
13390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
133a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
133b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
133c0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
133d0 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
133e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
133f0 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
13400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
13420 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
13430 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
13440 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
13450 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13460 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
13470 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
13480 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
13490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
134a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
134b0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
134c0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61   );..  sqlite3Pa
134d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
134e0 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ger, 0);.  if( p
134f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
13500 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
13510 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
13520 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3c 70 50  lse if( nPage<pP
13530 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
13540 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
13550 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
13560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
13580 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
13590 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
135a0 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
135b0 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ncating. */.    
135c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
135d0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
135e0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
135f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
13620 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
13630 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20 20  er, nPage);.    
13640 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
13650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
13660 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
13670 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
13680 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
13690 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
136a0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
136b0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
136c0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
136d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
136e0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
136f0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
13700 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
13710 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
13720 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
13730 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
13740 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
13750 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
13760 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
13770 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
13780 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
13790 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
137a0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
137b0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
137c0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
137d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
137e0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
137f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
13800 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
13810 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
13820 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
13830 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13840 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
13850 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
13860 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
13870 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
13880 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
13890 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
138a0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
138b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
138c0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
138d0 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64 69 73  *pPager){..  dis
138e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
138f0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
13900 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
13910 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67  Malloc();.  pPag
13920 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
13930 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
13940 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
13950 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
13960 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
13970 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  B ){.    pagerUn
13980 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
13990 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 65  pPager);.  }.  e
139a0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
139b0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
139c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
139d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45 52  alloc();.  PAGER
139e0 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
139f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13a00 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
13a10 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
13a20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70  pPager)).  if( p
13a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
13a40 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
13a50 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
13a60 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
13a70 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
13a80 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
13a90 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  rnal);.  sqlite3
13aa0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
13ab0 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
13ac0 6c 62 61 63 6b 29 3b 0a 20 20 69 66 28 20 70 50  lback);.  if( pP
13ad0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
13ae0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
13af0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
13b00 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
13b10 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
13b20 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
13b30 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
13b40 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
13b50 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
13b60 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
13b70 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
13b80 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
13b90 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
13ba0 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
13bb0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
13bc0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
13bd0 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
13be0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
13bf0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13c00 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
13c10 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
13c20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
13c30 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
13c40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13c50 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
13c60 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
13c70 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
13c80 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
13c90 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
13ca0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
13cb0 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
13cc0 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
13cd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
13ce0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
13cf0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
13d00 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
13d10 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
13d20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
13d30 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
13d40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
13d50 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
13d60 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13d70 52 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  Ref(pPg);.  retu
13d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13d90 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
13da0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
13db0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
13dc0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
13dd0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
13de0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
13df0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
13e00 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
13e10 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
13e20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
13e30 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
13e40 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
13e50 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
13e60 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
13e70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
13e80 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
13e90 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
13ea0 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
13eb0 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
13ec0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
13ed0 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
13ee0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
13ef0 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
13f00 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
13f10 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
13f20 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
13f30 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
13f40 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
13f50 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
13f60 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
13f70 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
13f80 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
13f90 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
13fa0 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
13fb0 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
13fc0 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
13fd0 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
13fe0 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
13ff0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
14000 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
14010 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
14020 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
14030 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
14040 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
14050 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
14060 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
14070 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
14080 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
14090 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
140a0 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
140b0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
140c0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
140d0 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
140e0 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
140f0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
14100 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
14110 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
14120 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
14130 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
14140 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
14150 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
14160 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
14170 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
14180 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
14190 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
141a0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
141b0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
141c0 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
141d0 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
141e0 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
141f0 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
14200 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
14210 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
14220 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14230 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
14240 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
14250 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
14260 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
14270 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
14280 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
14290 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
142a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
142b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
142c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
142d0 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
142e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
142f0 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
14300 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
14310 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
14320 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
14330 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
14340 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
14350 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
14360 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
14370 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14380 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
14390 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
143a0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
143b0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
143c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
143d0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
143e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
143f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14400 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69  Open );..      i
14410 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
14420 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
14430 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
14440 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
14450 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
14460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
14470 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
14480 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
14490 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
144a0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
144b0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
144c0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
144d0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
144e0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
144f0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
14500 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
14510 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
14520 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
14530 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
14540 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
14550 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
14560 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
14570 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
14580 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
14590 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
145a0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
145b0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
145c0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
145d0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
145e0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
145f0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
14600 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
14610 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
14620 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
14630 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
14640 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
14650 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
14660 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
14670 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
14680 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
14690 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
146a0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
146b0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
146c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
146d0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
146e0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
146f0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
14700 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
14710 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
14720 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14730 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
14740 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
14750 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
14760 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
14770 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14780 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14790 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
147a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
147b0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
147c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
147d0 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
147e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
147f0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
14800 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
14810 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
14820 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
14830 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
14840 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
14850 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
14860 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
14870 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
14880 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
14890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
148a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
148b0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
148c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
148d0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
148e0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
148f0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
14900 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14910 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
14920 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
14930 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
14940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14950 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14960 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14970 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
14980 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
14990 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
149a0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
149b0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
149c0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
149d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
149e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
149f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
14a00 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
14a10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
14a20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14a30 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
14a40 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
14a50 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
14a60 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
14a70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14a80 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
14a90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
14aa0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
14ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
14ac0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
14ad0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
14ae0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
14af0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
14b00 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
14b10 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
14b20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14b30 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72  ile. No calls ar
14b40 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  e made.** to the
14b50 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d   page-cache to m
14b60 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73  ark the pages as
14b70 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68   clean. It is th
14b80 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
14b90 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
14ba0 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43  r to use PcacheC
14bb0 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61  leanAll() or Pca
14bc0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74  cheMakeClean() t
14bd0 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61  o mark.** the pa
14be0 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  ges as clean..*/
14bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
14c00 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
14c10 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
14c20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
14c30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
14c40 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14c60 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
14c70 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
14c80 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14c90 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
14ca0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
14cb0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
14cc0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
14cd0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
14ce0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
14cf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
14d00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
14d10 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
14d20 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
14d30 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
14d40 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
14d50 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
14d60 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
14d70 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
14d80 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
14d90 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
14da0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
14db0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
14dc0 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
14dd0 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
14de0 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
14df0 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
14e00 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
14e10 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
14e20 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
14e30 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
14e40 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
14e50 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
14e60 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
14e70 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
14e80 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
14e90 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
14ea0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
14eb0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
14ec0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
14ed0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
14ee0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
14ef0 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
14f00 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
14f10 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
14f20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
14f30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
14f40 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
14f50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
14f60 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
14f70 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
14f80 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
14f90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14fa0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
14fb0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
14fc0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
14fd0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
14fe0 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
14ff0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
15000 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
15010 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
15020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15030 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15040 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
15050 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
15060 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
15070 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
15080 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
15090 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
150a0 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
150b0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
150c0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
150d0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
150e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
150f0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
15100 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
15110 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
15120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
15130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15140 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
15150 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
15160 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
15170 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
15180 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
15190 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
151a0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
151b0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
151c0 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
151d0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
151e0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
151f0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
15200 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
15210 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
15220 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
15230 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
15240 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
15250 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
15260 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
15270 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
15280 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
15290 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
152a0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
152b0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
152c0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
152d0 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
152e0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
152f0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
15300 70 44 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70 67  pData, pList->pg
15310 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
15320 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
15330 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
15340 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
15360 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15370 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
15380 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
15390 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
153a0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
153b0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
153c0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
153d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
153e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
153f0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
15400 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
15410 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
15420 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
15430 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
15440 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
15450 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
15460 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
15470 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
15480 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15490 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
154a0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
154b0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
154c0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
154d0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
154e0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
154f0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
15500 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
15510 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
15520 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15530 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
15540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15550 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15560 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15570 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
15580 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
15590 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
155a0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
155b0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
155c0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
155d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
155e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
155f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15600 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
15610 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
15620 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
15630 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
15640 20 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75   limit. The argu
15650 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
15660 72 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65  r to a purgeable
15670 20 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63   Pager .** objec
15680 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
15690 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b   attempts to mak
156a0 65 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79  e a single dirty
156b0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 6e   page that has n
156c0 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67  o.** outstanding
156d0 20 72 65 66 65 72 65 6e 63 65 73 20 28 69 66 20   references (if 
156e0 6f 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65 61  one exists) clea
156f0 6e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  n so that it can
15700 20 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a   be recycled .**
15710 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
15720 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
15730 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
15740 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
15750 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
15760 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
15770 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
15780 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
15790 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
157a0 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nc ){.    return
157b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
157c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
157d0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
157e0 59 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Y );.  if( pPage
157f0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
15800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15810 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
15820 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
15830 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
15840 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
15850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15860 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
15870 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
15880 20 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d         !(pPager-
15890 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
158a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
158b0 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
158c0 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
158d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
158e0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
158f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
15900 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20  E_APPEND).      
15910 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
15920 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
15930 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
15940 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15960 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15980 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
15990 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
159a0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
159b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
159c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
159d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
159e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
159f0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
15a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
15a20 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
15a30 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  n(pPg);.  }.  re
15a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
15a50 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
15a60 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
15a70 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
15a80 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
15a90 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
15aa0 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
15ab0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
15ac0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
15ad0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
15ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
15af0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
15b00 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
15b10 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
15b20 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
15b30 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
15b40 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
15b50 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
15b60 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
15b70 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
15b80 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  l..**.** Return 
15b90 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62  negative if unab
15ba0 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
15bb0 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
15bc0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
15bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
15be0 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  es not open the 
15bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
15c00 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63  examine its.** c
15c10 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20  ontent.  Hence, 
15c20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
15c30 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  t contain the na
15c40 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a  me of a master.*
15c50 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
15c60 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  hat has been del
15c70 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20  eted, and hence 
15c80 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a  not be hot.  Or.
15c90 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
15ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
15cb0 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74  ht be zeroed out
15cc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
15cd0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63  ** does not disc
15ce0 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73  over these cases
15cf0 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f   of a non-hot jo
15d00 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a  urnal - if the.*
15d10 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  * journal file e
15d20 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
15d30 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74   empty this rout
15d40 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a  ine assumes it.*
15d50 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70  * is hot.  The p
15d60 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
15d70 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
15d80 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a  cover that the.*
15d90 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
15da0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
15db0 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e   and will no-op.
15dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
15dd0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
15de0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15df0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
15e00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
15e10 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
15e20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15e30 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  _OK;.  int exist
15e40 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63  s = 0;.  int loc
15e50 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ked = 0;.  asser
15e60 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
15e70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15e80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
15e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15ea0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
15eb0 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ;.  *pExists = 0
15ec0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15ed0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
15ee0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
15ef0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
15f00 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
15f10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15f20 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
15f30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15f40 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
15f50 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
15f60 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  , &locked);.  }.
15f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15f80 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26  _OK && exists &&
15f90 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
15fa0 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
15fb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15fc0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
15fd0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
15fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15ff0 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61   ){.     if( nPa
16000 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
16010 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
16020 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
16030 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
16040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16050 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
16060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16070 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16080 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
16090 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
160a0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
160b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
160c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
160d0 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
160e0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
160f0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
16100 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
16110 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
16120 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
16130 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
16140 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
16150 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
16160 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
16170 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
16180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16190 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
161a0 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
161b0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
161c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
161d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
161e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
161f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
16200 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16210 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
16220 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
16230 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
16240 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
16250 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
16260 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
16270 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
16280 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
16290 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
162a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
162b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
162c0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
162d0 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
16310 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
16320 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
16330 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
16340 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
16350 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
16360 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
16370 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
16390 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
163a0 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
163b0 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
163c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
163d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
163e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
163f0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
16400 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
16410 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
16420 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
16430 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16440 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
16450 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
16460 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
16470 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
16480 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
16490 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
164a0 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
164b0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
164c0 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
164d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
164e0 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
164f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
16500 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
16510 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
16520 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
16530 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
16540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16550 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
16560 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16570 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16580 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72  E_OK;.  int isEr
16590 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20  rorReset = 0;.. 
165a0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
165b0 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
165c0 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
165d0 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
165e0 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
165f0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
16600 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
16610 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
16620 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
16630 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
16640 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
16650 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
16660 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
16670 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
16680 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
16690 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
166a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
166b0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
166c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
166d0 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
166e0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
166f0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26  ->pPCache)==0 &&
16700 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16710 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
16720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16730 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  en ){.      isEr
16740 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
16750 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
16760 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
16770 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
16780 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
16790 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
167a0 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
167b0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
167c0 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
167d0 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
167e0 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
167f0 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
16800 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
16810 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
16820 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
16830 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
16840 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
16850 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
16860 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
16870 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
16880 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
16890 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
168a0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
168b0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
168c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
168d0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
168e0 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
168f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
16900 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
16910 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
16920 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  isHotJournal;.  
16930 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
16940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16950 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16960 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
16970 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
16980 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
16990 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
169a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
169b0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
169c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
169d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
169e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
169f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16a00 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
16a10 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
16a20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16a30 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16a60 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
16a70 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  CK );.    }..   
16a80 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
16a90 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
16aa0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
16ab0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16ac0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
16ad0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16ae0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16af0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16b00 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16b10 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
16b20 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
16b30 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
16b40 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
16b50 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
16b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16b80 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
16b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16ba0 66 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  f( isErrorReset 
16bb0 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  || isHotJournal 
16bc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
16bd0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16be0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16bf0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
16c00 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
16c10 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
16c20 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
16c30 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
16c40 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
16c50 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
16c60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
16c70 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
16c80 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
16c90 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
16ca0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16cb0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
16cc0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
16cd0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
16ce0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
16cf0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
16d00 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
16d10 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
16d20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
16d30 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
16d40 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
16d50 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
16d60 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
16d70 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
16d80 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
16d90 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
16da0 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
16db0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
16dc0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
16dd0 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  o.      ** obtai
16de0 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
16df0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
16e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16e20 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
16e30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
16e40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16e50 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
16e60 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
16e70 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
16e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16ea0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
16eb0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16ec0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
16ed0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
16ee0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16ef0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
16f00 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d  CLUSIVE;.      }
16f10 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  . .      /* Open
16f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
16f30 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
16f40 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
16f50 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
16f60 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
16f70 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
16f80 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
16f90 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
16fa0 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  .      ** possib
16fb0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
16fc0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
16fd0 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  on. On some syst
16fe0 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ems, the.      *
16ff0 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
17000 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
17010 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
17020 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
17030 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
17040 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
17050 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
17060 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
17070 73 65 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  set && pPager->j
17080 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
17090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
170a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
170b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
170c0 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
170d0 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
170e0 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
170f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
17100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17110 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
17120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17130 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
17140 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
17150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17160 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
17170 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
17180 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
17190 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
171a0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
171b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
171c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
171d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
171e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
171f0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
17200 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
17210 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
17220 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
17230 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
17240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17250 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
17260 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17270 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
17280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
17290 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ANTOPEN;.       
172a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
172b0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
172c0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
172d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
172e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
172f0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
17300 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
17310 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65   that means some
17320 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
17330 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
17340 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64  s already rolled
17350 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20   it back */.    
17360 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17370 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
17380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
173a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
173b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
173c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
173d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
173e0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
173f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17400 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
17410 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
17420 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
17430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
17440 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
17450 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17460 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
17470 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
17480 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
17490 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
174a0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
174b0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
174c0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
174d0 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
174e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
174f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
17500 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ger, 1);.      i
17510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17530 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
17540 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
17550 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
17560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
17570 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
17580 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17590 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  || .          (p
175a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
175b0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
175c0 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
175d0 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ED).      );.   
175e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
175f0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
17600 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17610 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
17620 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
17630 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
17640 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
17650 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
17660 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
17670 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
17680 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
17690 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
176a0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
176b0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
176c0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
176d0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
176e0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
176f0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
17700 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17710 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
17720 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
17730 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
17740 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
17750 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
17760 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
17770 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
17780 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
17790 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
177a0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
177b0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
177c0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
177d0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
177e0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
177f0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
17800 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
17810 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
17820 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
17830 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
17840 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
17850 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
17860 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
17870 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
17880 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
17890 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
178a0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
178b0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
178c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
178d0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
178e0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
178f0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
17900 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
17910 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
17920 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
17930 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
17940 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
17950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17960 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
17970 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17980 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
17990 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
179a0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
179b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
179c0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
179d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
179e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
179f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
17a00 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
17a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
17a20 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
17a30 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
17a40 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
17a50 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
17a60 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
17a70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17a80 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17a90 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
17aa0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17ab0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
17ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17ad0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
17ae0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
17af0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
17b00 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
17b10 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
17b20 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
17b30 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
17b40 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
17b50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17b60 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
17b70 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
17b80 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
17b90 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17ba0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
17bb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17bc0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
17bd0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
17be0 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
17bf0 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
17c00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
17c10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
17c20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
17c30 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17c40 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
17c50 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
17c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17c70 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
17c80 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
17c90 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
17ca0 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
17cb0 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
17cc0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
17cd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17cf0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
17d00 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
17d10 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
17d20 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
17d30 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
17d40 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
17d50 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
17d60 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
17d70 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
17d80 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
17d90 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
17da0 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
17db0 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
17dc0 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
17dd0 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
17de0 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
17df0 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
17e00 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
17e10 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
17e20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17e30 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
17e40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
17e50 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
17e60 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 20 29 7b  HDR_NEED_READ ){
17e70 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65  .    int rc = re
17e80 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50  adDbPage(pPg->pP
17e90 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e  ager, pPg, pPg->
17ea0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
17eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17ec0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
17ed0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17ee0 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  READ;.    }else{
17ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17f20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
17f30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
17f40 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
17f50 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  , and the pager 
17f60 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  is not in the.**
17f70 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 77 72 69   middle of a wri
17f80 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
17f90 72 20 6f 70 65 6e 65 64 20 69 6e 20 65 78 63 6c  r opened in excl
17fa0 75 73 69 76 65 20 6d 6f 64 65 2c 20 75 6e 6c 6f  usive mode, unlo
17fb0 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74 61 74 69  ck it..*/ .stati
17fc0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
17fd0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
17fe0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
17ff0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
18000 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
18010 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
18020 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
18030 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
18040 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18050 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
18060 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
18070 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
18080 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
18090 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
180a0 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
180b0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
180c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
180d0 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
180e0 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
180f0 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
18100 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
18110 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
18120 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
18130 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
18140 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
18150 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
18160 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
18170 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18180 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
18190 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
181a0 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
181b0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
181c0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
181d0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
181e0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
181f0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
18200 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
18210 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
18220 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
18230 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
18240 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
18250 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
18260 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
18270 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18280 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
18290 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
182a0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
182b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
182c0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
182d0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
182e0 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
182f0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
18300 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
18310 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
18320 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
18330 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
18340 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
18350 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
18360 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
18370 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
18380 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
18390 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
183a0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
183b0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
183c0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
183d0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
183e0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
183f0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
18400 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
18410 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
18420 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18430 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
18440 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
18450 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
18460 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
18470 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
18480 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
18490 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
184a0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
184b0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
184c0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
184d0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
184e0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
184f0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
18500 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
18510 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
18520 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
18530 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
18540 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
18550 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
18560 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
18570 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
18580 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
18590 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
185a0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
185b0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
185c0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
185d0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
185e0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
185f0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
18600 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
18610 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
18620 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
18630 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
18640 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
18650 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
18660 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
18670 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
18680 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
18690 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
186a0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
186b0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
186c0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
186d0 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
186e0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
186f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
18700 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
18710 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
18720 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
18730 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
18740 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
18750 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
18760 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
18770 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
18780 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18790 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
187a0 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
187b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
187c0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
187d0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
187e0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
187f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
18800 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
18810 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
18820 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
18830 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
18840 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
18850 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
18860 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
18870 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
18880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18890 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
188a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
188b0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
188c0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
188d0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
188e0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
188f0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
18900 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
18910 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
18920 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
18930 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
18940 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
18950 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
18960 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
18970 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18980 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
18990 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK .       || 
189a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
189b0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
189c0 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20  Cache)>0 .      
189d0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b   || pgno==1.  );
189e0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
189f0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
18a00 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
18a10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
18a20 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
18a30 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18a40 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
18a50 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
18a60 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
18a70 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
18a80 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
18a90 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
18aa0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
18ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18ac0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
18ad0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
18ae0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
18af0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
18b00 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
18b10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
18b20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
18b30 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18b40 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
18b50 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
18b60 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
18b70 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
18b80 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
18b90 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
18ba0 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
18bb0 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
18bc0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
18bd0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
18be0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
18bf0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
18c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18c20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18c30 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
18c40 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20  UNLOCK );..  rc 
18c50 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
18c60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
18c70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26  ache, pgno, 1, &
18c80 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pPg);.  if( rc!=
18c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18cb0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
18cc0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
18cd0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
18ce0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
18cf0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
18d00 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
18d10 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
18d20 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
18d30 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47  nt nMax;.    PAG
18d40 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
18d50 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d  nMiss);.    pPg-
18d60 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
18d70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
18d80 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
18d90 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a 20  ger->nExtra);.. 
18da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18db0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
18dc0 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
18dd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
18df0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
18e00 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
18e10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
18e20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
18e30 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
18e40 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
18e50 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
18e60 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
18e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18e80 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
18e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18ea0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
18eb0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
18ec0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
18ed0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18ee0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
18ef0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
18f00 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
18f10 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
18f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
18f30 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
18f40 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
18f50 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
18f60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
18f70 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
18f80 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
18f90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18fa0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
18fb0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18fc0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  D ){.        /* 
18fd0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18fe0 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20 20 20 20  f(pPg); */.     
18ff0 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65     pagerDropPage
19000 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
19010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19020 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
19030 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
19040 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
19050 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
19060 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
19070 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
19080 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
19090 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
190a0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
190b0 20 20 61 73 73 65 72 74 28 73 71 6c 69 74 65 33    assert(sqlite3
190c0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
190d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
190e0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
190f0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
19100 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
19110 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
19120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
19130 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
19140 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
19150 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rc ){.        sq
19160 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19170 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
19180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19190 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
191a0 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72  pPage = pPg;.  r
191b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
191c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
191d0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
191e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
191f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
19200 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
19210 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
19220 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
19230 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
19240 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
19250 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19260 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
19270 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
19280 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
19290 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
192a0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
192b0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
192c0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
192d0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
192e0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
192f0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
19300 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
19310 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
19320 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
19330 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
19340 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
19350 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
19360 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
19370 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
19380 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
19390 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
193a0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
193b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
193c0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
193d0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
193e0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
193f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
19400 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
19410 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d  (pPager->state!=
19420 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20  PAGER_UNLOCK).  
19430 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72   && (pPager->err
19440 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
19450 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
19460 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  de==SQLITE_FULL)
19470 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
19480 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
19490 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
194a0 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
194b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  }..  return pPg;
194c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
194d0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
194e0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
194f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
19500 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
19510 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
19520 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
19530 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
19540 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
19550 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
19560 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
19570 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
19580 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
19590 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
195a0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
195b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
195c0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
195d0 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
195e0 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
195f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19600 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
19610 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
19620 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
19630 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
19640 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
19650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19660 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
19670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19680 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
19690 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
196a0 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
196b0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
196c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
196d0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
196e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
196f0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
19700 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
19710 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
19720 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19730 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
19740 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
19750 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
19760 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
19770 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
19780 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
19790 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
197a0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
197b0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
197c0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
197d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
197e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
197f0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
19800 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69  EN_CREATE);..  i
19810 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
19820 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
19830 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
19840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19850 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
19860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19870 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
19880 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
19890 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
198a0 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  ger, 0);.  pPage
198b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
198c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
198d0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
198e0 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze);.  if( pPage
198f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
19900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19910 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
19920 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
19930 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
19940 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
19950 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
19960 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19970 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
19980 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
19990 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
199a0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
199b0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
199c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
199d0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
199e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
199f0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
19a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
19a10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
19a20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
19a30 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
19a40 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
19a50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
19a60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19a70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
19a80 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19a90 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
19aa0 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ITE.      rc = s
19ab0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
19ac0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66  n(.          pVf
19ad0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
19ae0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
19af0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
19b00 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
19b10 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
19b20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19b30 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
19b40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
19b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
19b60 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
19b70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
19b90 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
19ba0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70  Methods );.    p
19bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19bc0 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
19bd0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
19be0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
19bf0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
19c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
19c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
19c30 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M ){.        sql
19c40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
19c50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
19c60 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
19c70 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
19c80 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19c90 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  al;.    }.  }.  
19ca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19cb0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
19cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19cd0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
19ce0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
19cf0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
19d00 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
19d10 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19d20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19d30 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
19d40 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19d50 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
19d60 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
19d70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19d80 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
19d90 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
19da0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19db0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
19dc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19dd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19de0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
19df0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
19e00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19e10 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
19e20 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
19e30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
19e40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
19e50 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
19e60 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
19e70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19e90 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
19ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19eb0 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
19ec0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
19ed0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
19ee0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
19ef0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
19f00 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19f10 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
19f20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
19f30 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
19f40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19f50 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
19f60 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
19f70 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
19f80 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
19f90 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
19fa0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19fb0 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
19fc0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
19fd0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19fe0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19ff0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a000 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
1a010 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1a020 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1a030 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
1a040 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
1a050 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
1a060 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
1a070 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
1a080 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1a090 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
1a0a0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1a0b0 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
1a0c0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
1a0d0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
1a0e0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
1a0f0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
1a100 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1a110 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1a120 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1a130 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1a140 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1a150 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1a160 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1a170 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1a180 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1a190 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1a1a0 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1a1b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a1c0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1a1d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1a1e0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1a1f0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1a200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a210 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1a220 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1a230 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1a240 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1a250 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1a260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a270 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1a280 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1a290 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1a2a0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1a2b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1a2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1a2d0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1a2e0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1a2f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a300 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1a310 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1a320 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1a330 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1a340 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1a350 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1a360 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1a370 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1a380 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1a390 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1a3a0 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1a3b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1a3c0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1a3d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1a3e0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1a3f0 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1a400 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1a410 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1a420 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1a430 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a440 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1a450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a460 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1a470 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1a480 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1a490 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1a4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a4b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1a4c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a4d0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72   !MEMDB );.    r
1a4e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1a4f0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1a500 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1a510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
1a530 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1a540 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
1a550 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
1a560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1a570 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1a580 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1a590 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1a5a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a5b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a5c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1a5e0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1a5f0 20 30 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41   0;.    PAGERTRA
1a600 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
1a610 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a620 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1a630 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1a640 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
1a650 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20  >tempFile.      
1a660 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1a670 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1a680 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1a690 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
1a6a0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1a6b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1a6c0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1a6d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a6e0 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
1a6f0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
1a700 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1a710 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
1a720 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
1a730 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1a740 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  he last.    ** t
1a750 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
1a760 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
1a770 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
1a780 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
1a790 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
1a7a0 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
1a7b0 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
1a7c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
1a7d0 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
1a7e0 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72   open and either
1a7f0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
1a800 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73  o 0 bytes or its
1a810 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20   header was.    
1a820 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
1a830 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
1a840 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1a850 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
1a860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a870 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
1a880 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1a890 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1a8a0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73  rnal==0 );.    s
1a8b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1a8c0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
1a8d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
1a8e0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1a8f0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70  3BitvecCreate( p
1a900 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1a910 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1a920 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->pInJournal ){.
1a930 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a940 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1a950 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
1a960 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1a970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1a980 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1a990 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a9a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
1a9b0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a9c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
1a9d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a9e0 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
1a9f0 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
1aa00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1aa10 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
1aa20 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
1aa30 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
1aa40 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
1aa50 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
1aa60 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1aa70 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
1aa80 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
1aa90 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
1aaa0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
1aab0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
1aac0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1aad0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1aae0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
1aaf0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
1ab00 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
1ab10 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ab20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ab30 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
1ab40 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
1ab50 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
1ab60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1ab70 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
1ab80 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
1ab90 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
1aba0 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
1abb0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
1abc0 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
1abd0 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
1abe0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
1abf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1ac00 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1ac10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
1ac20 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
1ac30 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
1ac40 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
1ac50 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
1ac60 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
1ac70 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
1ac80 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
1ac90 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
1aca0 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
1acb0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
1acc0 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
1acd0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
1ace0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
1acf0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
1ad00 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
1ad10 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ad20 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
1ad30 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
1ad40 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
1ad50 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
1ad60 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1ad70 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
1ad80 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1ad90 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1ada0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1adb0 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
1adc0 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
1add0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1ade0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
1adf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1ae00 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ae10 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1ae20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
1ae30 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
1ae40 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
1ae50 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
1ae60 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1ae70 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
1ae80 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1ae90 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1aea0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
1aeb0 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
1aec0 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
1aed0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
1aee0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
1aef0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
1af00 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
1af10 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
1af20 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
1af30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1af40 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
1af50 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
1af60 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
1af70 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
1af80 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
1af90 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
1afa0 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
1afb0 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
1afc0 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
1afd0 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
1afe0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1aff0 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
1b000 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
1b010 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
1b020 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1b030 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
1b040 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1b050 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1b060 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1b070 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
1b080 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
1b090 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
1b0a0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
1b0b0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
1b0c0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
1b0d0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1b0e0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
1b0f0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
1b100 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1b110 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d  && (pageInStatem
1b120 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67  ent(pPg) || pPag
1b130 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1b140 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1b150 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1b160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
1b170 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
1b180 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
1b190 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
1b1a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1b1b0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
1b1c0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
1b1d0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
1b1e0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
1b1f0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
1b200 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1b210 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
1b220 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
1b230 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
1b240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1b250 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
1b260 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
1b270 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
1b280 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1b290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b2a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1b2b0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
1b2c0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1b2d0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
1b2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b2f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b300 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1b310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b320 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1b330 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
1b340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1b350 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
1b360 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  eJournal.       
1b370 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
1b380 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1b390 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
1b3a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1b3b0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b3c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1b3d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b3e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1b3f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1b400 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1b410 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b420 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
1b430 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
1b440 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1b450 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
1b460 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
1b470 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
1b480 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1b490 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1b4a0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
1b4b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1b4c0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
1b4d0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1b4e0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
1b4f0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1b500 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1b510 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1b520 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
1b530 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1b540 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
1b550 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1b560 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
1b570 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
1b580 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
1b590 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
1b5a0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1b5b0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1b5c0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1b5d0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
1b5e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1b5f0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1b600 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1b610 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1b620 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1b630 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1b640 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1b650 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1b660 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1b670 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
1b680 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1b690 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1b6a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
1b6b0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1b6c0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1b6d0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
1b6e0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1b6f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b700 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1b710 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1b720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b750 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
1b760 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1b770 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b7a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
1b7b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
1b7c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b7d0 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
1b7e0 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
1b7f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1b800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b810 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
1b820 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1b830 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
1b840 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
1b850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1b860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b870 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
1b880 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1b890 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1b8a0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1b8b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1b8d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b8e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b8f0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
1b900 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1b910 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1b920 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
1b930 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
1b940 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
1b950 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
1b960 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1b970 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1b980 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1b990 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b9a0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
1b9b0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
1b9c0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
1b9d0 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20  sh(pPg));..     
1b9e0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
1b9f0 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1ba00 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1ba10 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1ba20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1ba30 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
1ba40 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
1ba50 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
1ba60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1ba70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ba80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1ba90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1baa0 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
1bab0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1bac0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bad0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
1bae0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
1baf0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1bb00 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1bb10 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1bb20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1bb30 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1bb40 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
1bb50 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
1bb60 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
1bb70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1bb80 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1bb90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1bba0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1bbb0 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1bbc0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1bbd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1bbe0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
1bbf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1bc00 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1bc10 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
1bc20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1bc30 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
1bc40 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
1bc50 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
1bc60 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
1bc70 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1bc80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1bc90 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1bca0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bcc0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1bcd0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
1bce0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1bcf0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
1bd00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1bd10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1bd20 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1bd30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bd40 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1bd50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1bd60 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1bd70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1bd80 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1bd90 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1bda0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1bdb0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1bdc0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1bdd0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1bde0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1bdf0 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1be00 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1be10 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1be20 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1be30 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1be40 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1be50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1be60 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1be70 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
1be80 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1be90 20 0a 20 20 20 20 20 26 26 20 70 50 67 2d 3e 70   .     && pPg->p
1bea0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
1beb0 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  tSize .    ){.  
1bec0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1bed0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1bee0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
1bef0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
1bf00 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
1bf10 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1bf20 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1bf30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bf40 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
1bf50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
1bf60 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1bf70 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
1bf80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1bf90 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65  ger->stfd, offse
1bfa0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
1bfb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1bfc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bfd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1bfe0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
1bff0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1c000 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1c010 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
1c020 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c030 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1c040 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c050 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c060 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c0a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1c0b0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1c0c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c0d0 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->pInStmt!=0 );
1c0e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
1c0f0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1c100 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
1c110 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  no);.    }.  }..
1c120 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1c130 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
1c140 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
1c150 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c160 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1c170 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
1c180 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
1c190 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1c1a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1c1b0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1c1c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1c1d0 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ==(PAGER_MJ_PGNO
1c1e0 28 70 50 61 67 65 72 29 2d 31 29 20 29 7b 0a 20  (pPager)-1) ){. 
1c1f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c200 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1c210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c220 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c230 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1c240 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
1c250 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
1c260 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
1c270 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
1c280 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
1c290 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1c2a0 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
1c2b0 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
1c2c0 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
1c2d0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
1c2e0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1c2f0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
1c300 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
1c310 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
1c320 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
1c330 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
1c340 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
1c350 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
1c360 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
1c370 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1c380 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
1c390 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
1c3a0 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
1c3b0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1c3c0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1c3d0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
1c3e0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
1c3f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c400 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
1c410 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c420 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
1c430 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1c440 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1c450 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c460 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
1c470 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
1c480 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
1c490 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c4a0 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
1c4b0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
1c4c0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
1c4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1c4e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1c4f0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
1c500 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
1c510 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
1c520 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1c530 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1c540 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1c550 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
1c560 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1c570 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c580 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
1c590 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
1c5a0 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
1c5b0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
1c5c0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
1c5d0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1c5e0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1c5f0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1c600 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1c610 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1c620 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1c630 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1c640 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1c650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1c660 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1c670 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
1c680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c690 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
1c6a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
1c6b0 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
1c6c0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
1c6d0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
1c6e0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
1c6f0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
1c700 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
1c710 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
1c720 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
1c730 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
1c740 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
1c750 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
1c760 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1c770 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1c780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
1c790 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
1c7a0 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
1c7b0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
1c7c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1c7d0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1c7e0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
1c7f0 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  unt);.    if( pP
1c800 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
1c810 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1c820 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
1c830 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
1c840 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
1c850 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
1c860 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1c870 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
1c880 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
1c890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
1c8a0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
1c8b0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
1c8c0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
1c8d0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
1c8e0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c8f0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
1c900 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
1c910 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1c920 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
1c930 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
1c940 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
1c950 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
1c960 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
1c970 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
1c980 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
1c990 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1c9a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
1c9b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
1c9c0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
1c9d0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1c9e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c9f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1ca00 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
1ca10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ca20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ca30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1ca40 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
1ca50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ca60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
1ca70 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1ca80 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
1ca90 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
1caa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1cac0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1cad0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1cae0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1caf0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
1cb00 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
1cb10 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
1cb20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1cb30 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
1cb40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1cb50 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
1cb60 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
1cb70 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1cb80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
1cb90 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1cba0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1cbb0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1cbc0 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
1cbd0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
1cbe0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
1cbf0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
1cc00 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
1cc10 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
1cc20 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
1cc30 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
1cc40 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
1cc50 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
1cc60 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
1cc70 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
1cc80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
1cc90 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
1cca0 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
1ccb0 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
1ccc0 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
1ccd0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
1cce0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1ccf0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
1cd00 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
1cd10 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
1cd20 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
1cd30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
1cd40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
1cd50 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
1cd60 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
1cd70 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1cd80 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
1cd90 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
1cda0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
1cdb0 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e   pPage ) pPage->
1cdc0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1cdd0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1cde0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1cdf0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1ce00 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1ce10 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
1ce20 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
1ce30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1ce40 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
1ce50 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1ce60 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
1ce70 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1ce80 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
1ce90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cea0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1ceb0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1cec0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1ced0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1cee0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1cef0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1cf00 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
1cf10 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1cf20 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1cf30 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1cf40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1cf50 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1cf60 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1cf70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1cf80 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
1cf90 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
1cfa0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1cfb0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
1cfc0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1cfd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1cfe0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1cff0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1d000 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1d010 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1d020 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
1d030 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1d040 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1d050 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1d060 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1d070 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
1d080 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
1d090 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
1d0a0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
1d0b0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
1d0c0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
1d0d0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
1d0e0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
1d0f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
1d100 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1d110 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1d120 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1d130 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1d140 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1d150 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1d160 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1d170 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1d180 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1d190 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1d1a0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1d1b0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1d1c0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1d1d0 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1d1e0 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1d1f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d200 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1d210 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1d220 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1d230 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1d240 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1d250 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1d260 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1d270 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1d280 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d290 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1d2a0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1d2b0 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1d2c0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1d2d0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d2e0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1d2f0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
1d300 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
1d310 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
1d320 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1d330 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
1d340 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
1d350 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
1d360 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1d370 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
1d380 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
1d390 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
1d3a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
1d3b0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
1d3c0 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
1d3d0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1d3e0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
1d3f0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1d400 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
1d410 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
1d420 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1d430 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1d440 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
1d450 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
1d460 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1d470 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
1d480 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1d490 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1d4a0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
1d4b0 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
1d4c0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1d4d0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1d4e0 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
1d4f0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
1d500 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1d510 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
1d520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d530 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
1d540 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1d550 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1d560 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1d570 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d580 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1d590 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ;..  if( pPg->pg
1d5a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1d5b0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
1d5c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d5d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1d5e0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1d5f0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1d600 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1d610 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1d620 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
1d630 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 42 69  back = sqlite3Bi
1d640 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
1d650 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a  r->origDbSize);.
1d660 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1d670 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1d680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d690 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d6a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
1d6b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1d6c0 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
1d6d0 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
1d6e0 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  gno);..  if( rc=
1d6f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
1d700 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d710 44 49 52 54 59 29 20 26 26 20 21 70 50 61 67 65  DIRTY) && !pPage
1d720 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1d730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d740 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1d750 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1d760 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d770 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  e==pPg->pgno && 
1d780 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d790 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1d7a0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1d7b0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1d7c0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1d7d0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1d7e0 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1d7f0 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1d800 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d810 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1d820 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1d830 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1d840 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1d850 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1d860 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1d870 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1d880 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1d890 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1d8a0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1d8b0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1d8c0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1d8d0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1d8e0 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1d8f0 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1d900 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1d910 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1d920 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1d930 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1d940 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1d950 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1d960 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1d970 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1d980 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1d990 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1d9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9b0 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1d9c0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1d9d0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1d9e0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1d9f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1da00 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1da10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1da20 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
1da30 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1da40 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
1da50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1da60 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1da70 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1da80 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1da90 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1daa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1dab0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
1dac0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1dad0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1dae0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1daf0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1db00 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1db10 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1db20 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1db30 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1db40 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1db50 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1db60 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1db70 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1db80 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1db90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1dba0 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
1dbb0 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
1dbc0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
1dbd0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
1dbe0 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
1dbf0 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
1dc00 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
1dc10 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
1dc20 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
1dc30 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
1dc40 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
1dc50 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
1dc60 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
1dc70 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
1dc80 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
1dc90 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1dca0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dcb0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1dcc0 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
1dcd0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1dce0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1dcf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dd00 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1dd10 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f  RESERVED );..  /
1dd20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1dd30 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
1dd40 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28  n, or DontWrite(
1dd50 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1dd60 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70  d on.  ** this p
1dd70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29  age (DontWrite()
1dd80 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79 73   sets the always
1dd90 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20  Rollback flag), 
1dda0 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66  then this.  ** f
1ddb0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1ddc0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1ddd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1dde0 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c  en==0 .   || sql
1ddf0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
1de00 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1de10 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e  llback, pPg->pgn
1de20 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67  o).   || pPg->pg
1de30 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1de40 62 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20 20 72  bSize.  ){.    r
1de50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69 66 64  eturn;.  }..#ifd
1de60 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
1de70 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20 73 71  _DELETE.  if( sq
1de80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
1de90 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1dea0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 21 3d  al, pPg->pgno)!=
1deb0 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  0.   || pPg->pgn
1dec0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1ded0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
1dee0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
1def0 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44    /* If SECURE_D
1df00 45 4c 45 54 45 20 69 73 20 64 69 73 61 62 6c 65  ELETE is disable
1df10 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
1df20 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 69   no way that thi
1df30 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63  s.  ** routine c
1df40 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  an be called on 
1df50 61 20 70 61 67 65 20 66 6f 72 20 77 68 69 63 68  a page for which
1df60 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1df70 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61  tWrite().  ** ha
1df80 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
1df90 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72  ously called dur
1dfa0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 72 61  ing the same tra
1dfb0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  nsaction..  ** A
1dfc0 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28  nd if DontWrite(
1dfd0 29 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) has previously
1dfe0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1dff0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1e000 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
1e010 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20   be met..  **.  
1e020 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e 6f 74  ** (Later:)  Not
1e030 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 20 64   true.  If the d
1e040 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
1e050 70 74 65 64 20 62 79 20 68 61 76 69 6e 67 20 64  pted by having d
1e060 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20 70 61  uplicate.  ** pa
1e070 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e080 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75 70 74  ist (ex: corrupt
1e090 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74 68 65  9.test) then the
1e0a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f   following is no
1e0b0 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69  t.  ** necessari
1e0c0 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a 20 20  ly true:.  */.  
1e0d0 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  /* assert( !pPg-
1e0e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1e0f0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1e100 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1e110 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65  ze ); */..  asse
1e120 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1e130 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
1e140 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
1e150 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1e160 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
1e170 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
1e180 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
1e190 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e1a0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1e1b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e1c0 3e 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61  >stmtSize >= pPa
1e1d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1e1e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
1e1f0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1e200 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
1e210 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  no);.  }.  PAGER
1e220 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1e230 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1e240 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1e250 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1e260 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  r));.  IOTRACE((
1e270 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
1e280 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1e290 70 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pgno)).}.../*.**
1e2a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e2b0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
1e2c0 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
1e2d0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
1e2e0 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
1e2f0 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
1e300 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
1e310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e320 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1e330 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
1e340 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
1e350 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
1e360 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1e370 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1e380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e390 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e3a0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1e3b0 52 49 54 45 0a 20 20 61 73 73 65 72 74 28 20 69  RITE.  assert( i
1e3c0 73 44 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f  sDirect==0 );  /
1e3d0 2a 20 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e  * isDirect is on
1e3e0 6c 79 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d  ly true for atom
1e3f0 69 63 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e  ic writes */.#en
1e400 64 69 66 0a 20 20 69 66 28 20 21 70 50 61 67 65  dif.  if( !pPage
1e410 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1e420 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1e430 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1e440 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1e450 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1e460 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1e470 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1e480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e490 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1e4a0 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21  n rc;..    if( !
1e4b0 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
1e4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e4d0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
1e4e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e4f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e500 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e510 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1e520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e530 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1e540 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
1e550 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1e560 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1e570 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1e580 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
1e590 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
1e5a0 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
1e5b0 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
1e5c0 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67  Vers);.    chang
1e5d0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1e5e0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e5f0 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r*)pPgHdr->pData
1e600 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1e610 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53  nter);..#ifdef S
1e620 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1e630 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66  MIC_WRITE.    if
1e640 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
1e650 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1e660 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
1e670 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70  t void *zBuf = p
1e680 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20  PgHdr->pData;.  
1e690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1e6b0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
1e6c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
1e6d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1e6e0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
1e6f0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1e700 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
1e710 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
1e720 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
1e730 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1e740 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1e750 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
1e760 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
1e770 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  e to disk..*/.in
1e780 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
1e790 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1e7a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1e7b0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1e7c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1e7e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1e7f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1e800 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1e810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1e830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e840 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
1e850 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
1e860 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
1e870 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
1e880 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1e890 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1e8a0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
1e8b0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
1e8c0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
1e8d0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
1e8e0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
1e8f0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
1e900 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
1e910 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1e920 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1e930 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e940 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1e950 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
1e960 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
1e970 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
1e980 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e990 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
1e9a0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
1e9b0 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
1e9c0 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
1e9d0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
1e9e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
1e9f0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1ea00 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
1ea10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ea20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
1ea30 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
1ea40 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
1ea50 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
1ea60 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
1ea70 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
1ea80 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
1ea90 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1eaa0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
1eab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1eac0 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
1ead0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1eae0 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
1eaf0 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
1eb00 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
1eb10 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
1eb20 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1eb30 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ses)..**.** If t
1eb40 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
1eb50 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
1eb60 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1eb70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
1eb80 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
1eb90 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
1eba0 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
1ebb0 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
1ebc0 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
1ebd0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1ebe0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
1ebf0 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
1ec00 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
1ec10 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
1ec20 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1ec30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1ec40 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1ec50 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
1ec60 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ger, .  const ch
1ec70 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20  ar *zMaster, .  
1ec80 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69  Pgno nTrunc,.  i
1ec90 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69  nt noSync.){.  i
1eca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ecb0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
1ecc0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1ecd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ece0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
1ecf0 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73  /* If no changes
1ed00 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c   have been made,
1ed10 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68   we can leave th
1ed20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61  e transaction ea
1ed30 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rly..  */.  if( 
1ed40 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
1ed50 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ed==0 &&.       
1ed60 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
1ed70 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1ed80 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
1ed90 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ||.          pPa
1eda0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1edb0 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73  de!=0) ){.    as
1edc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
1edd0 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
1ede0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1edf0 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  en==0 );.    ret
1ee00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ee10 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
1ee20 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  4("DATABASE SYNC
1ee30 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
1ee40 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e  r=%s nTrunc=%d\n
1ee50 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
1ee60 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
1ee70 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a  ster, nTrunc);..
1ee80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1ee90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
1eea0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
1eeb0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1eec0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
1eed0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
1eee0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1eef0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1ef00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1ef10 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1ef20 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
1ef30 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
1ef40 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
1ef50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64  gHdr *pPg;..#ifd
1ef60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ef70 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1ef80 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d    /* The atomic-
1ef90 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
1efa0 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
1efb0 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20  f all of the.   
1efc0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72   ** following ar
1efd0 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20  e true:.    **. 
1efe0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66     **    + The f
1eff0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
1f000 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
1f010 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
1f020 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c  r.    **      bl
1f030 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
1f040 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20  e-size, and.    
1f050 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d  **    + This com
1f060 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
1f070 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1f080 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
1f090 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61  .    **    + Exa
1f0a0 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
1f0b0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1f0c0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
1f0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
1f0e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1f0f0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
1f100 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68   can be used, th
1f110 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1f120 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20  ile will never. 
1f130 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64     ** be created
1f140 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
1f150 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
1f160 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57    int useAtomicW
1f170 72 69 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20  rite;.    pPg = 
1f180 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1f190 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1f1a0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65  PCache);.    use
1f1b0 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
1f1c0 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
1f1d0 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
1f1e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1f1f0 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1f200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1f210 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
1f220 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20  Pager) && .     
1f230 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20     nTrunc==0 && 
1f240 0a 20 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30  .        (pPg==0
1f250 20 7c 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d   || pPg->pDirty=
1f260 3d 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  =0).    );.    a
1f270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1f280 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
1f290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1f2a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1f2b0 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20  MODE_OFF );.    
1f2c0 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69  if( useAtomicWri
1f2d0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  te ){.      /* U
1f2e0 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66  pdate the nRec f
1f2f0 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  ield in the jour
1f300 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
1f310 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20     int offset = 
1f320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1f330 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
1f340 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
1f350 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1f360 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20  >nRec==1);.     
1f370 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1f380 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f  s(pPager->jfd, o
1f390 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e  ffset, pPager->n
1f3a0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Rec);..      /* 
1f3b0 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
1f3c0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
1f3d0 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
1f3e0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
1f3f0 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69  y.      ** the i
1f400 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
1f410 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20  ntation of page 
1f420 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  1 to include the
1f430 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a   updated.      *
1f440 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
1f450 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
1f460 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20  page 1 directly 
1f470 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
1f480 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42        ** file. B
1f490 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
1f4a0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
1f4b0 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
1f4c0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20  file-system, .  
1f4d0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73      ** this is s
1f4e0 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  afe..      */.  
1f4f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f510 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
1f520 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1f530 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
1f540 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1f550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f560 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
1f570 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
1f580 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41  }..    if( !useA
1f590 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63  tomicWrite && rc
1f5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65  ==SQLITE_OK ).#e
1f5b0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
1f5c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f5d0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
1f5e0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f5f0 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
1f600 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
1f610 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
1f620 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
1f630 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
1f640 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
1f650 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
1f660 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
1f670 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
1f680 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
1f690 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1f6a0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
1f6b0 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
1f6c0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
1f6d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1f6e0 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
1f6f0 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
1f700 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
1f710 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1f720 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1f730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1f740 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1f750 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
1f760 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1f780 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1f790 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f7a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1f7b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1f7c0 46 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  FF ){.#ifndef SQ
1f7d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f7e0 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
1f7f0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1f800 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1f810 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1f820 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1f830 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1f840 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1f850 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1f860 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1f870 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1f880 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1f890 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1f8a0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
1f8b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f8c0 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
1f8d0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 53 6b 69         Pgno iSki
1f8e0 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
1f8f0 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
1f900 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
1f910 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
1f920 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
1f930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f940 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
1f950 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1f960 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
1f970 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
1f980 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f990 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1f9a0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
1f9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f9c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f9d0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1f9e0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1f9f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fa00 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1fa20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1fa30 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fa40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fa50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fa60 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1fa70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1fa80 20 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64   .        }.#end
1fa90 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  if.        rc = 
1faa0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
1fab0 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
1fac0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1fad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fae0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1faf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79  .        rc = sy
1fb00 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1fb10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1fb20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fb30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1fb40 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65  nc_exit;..#ifnde
1fb50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fb60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1fb70 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1fb80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fb90 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
1fba0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1fbb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fbc0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1fbd0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
1fbe0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
1fbf0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
1fc00 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1fc10 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1fc20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
1fc30 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1fc40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1fc50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1fc60 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1fc70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fc80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fc90 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1fca0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
1fcb0 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ED );.      /* T
1fcc0 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68  he error might h
1fcd0 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72  ave left the dir
1fce0 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c  ty list all foul
1fcf0 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20  ed up here,.    
1fd00 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f    ** but that do
1fd10 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65  es not matter be
1fd20 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20  cause if the if 
1fd30 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64  the dirty list d
1fd40 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20  id.      ** get 
1fd50 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
1fd60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fd70 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61  will roll back a
1fd80 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63  nd.      ** disc
1fd90 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69  ard the dirty li
1fda0 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  st.  There is an
1fdb0 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20   assert in.     
1fdc0 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c   ** pager_get_al
1fdd0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20  l_dirty_pages() 
1fde0 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68  that verifies th
1fdf0 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20  at no attempt.  
1fe00 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74      ** is made t
1fe10 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64  o use an invalid
1fe20 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20   dirty list..   
1fe30 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f     */.      goto
1fe40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fe50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  }.    sqlite3Pca
1fe60 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
1fe70 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
1fe80 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1fe90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1fea0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1feb0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
1fec0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1fed0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1fee0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1fef0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1ff00 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
1ff10 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
1ff20 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
1ff30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1ff40 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
1ff50 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
1ff60 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
1ff70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ff80 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
1ff90 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1ffa0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1ffb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ffc0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
1ffd0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
1ffe0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1fff0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
20000 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
20010 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
20020 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
20030 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
20040 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
20050 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
20060 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
20070 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
20080 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
20090 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
200a0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
200b0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
200c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
200d0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72  TE_BUSY;.  }.  r
200e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
200f0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
20100 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
20110 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
20120 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
20130 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
20140 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
20150 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
20160 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
20170 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
20180 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
20190 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
201a0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
201b0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
201c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
201d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
201e0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
201f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20200 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20210 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
20220 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
20230 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20240 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
20250 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
20260 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
20270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20280 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
20290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
202a0 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20  Modified==0 &&. 
202b0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
202c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
202d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
202e0 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20  ELETE ||.       
202f0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
20300 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a  siveMode!=0) ){.
20310 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20320 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
20330 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 || pPager->jou
20340 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
20350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20360 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  _OK;.  }.  PAGER
20370 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
20380 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
20390 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ager));.  assert
203a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
203b0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
203c0 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65   MEMDB || !pPage
203d0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
203e0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
203f0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
20400 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
20410 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  tMaster);.  rc =
20420 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
20430 67 65 72 2c 20 72 63 29 3b 0a 20 20 72 65 74 75  ger, rc);.  retu
20440 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20450 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
20460 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
20470 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
20480 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
20490 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
204a0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
204b0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
204c0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
204d0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
204e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
204f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
20500 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
20510 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
20520 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
20530 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
20540 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
20550 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
20560 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
20570 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
20580 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
20590 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
205a0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
205b0 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
205c0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
205d0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
205e0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
205f0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
20600 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
20610 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
20620 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
20630 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
20640 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20650 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20660 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20670 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20690 45 5f 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52 41  E_OK;.  PAGERTRA
206a0 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
206b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
206c0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 21 70 50  ger));.  if( !pP
206d0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
206e0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
206f0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
20700 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
20710 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20720 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
20730 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
20740 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20750 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20760 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20770 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
20780 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20790 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
207a0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
207b0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
207c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
207d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
207e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
207f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20800 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
20810 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
20820 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
20830 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
20840 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
20850 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
20860 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20870 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
20880 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
20890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
208a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
208b0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
208c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
208d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
208e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
208f0 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
20900 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
20910 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
20920 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
20930 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20940 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
20950 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
20960 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
20970 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
20980 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
20990 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
209a0 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
209b0 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
209c0 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
209d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
209e0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
209f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
20a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20a10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
20a20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20a30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
20a40 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
20a50 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
20a60 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
20a70 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
20a80 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
20a90 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
20aa0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
20ab0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
20ac0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
20ad0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20ae0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
20af0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
20b00 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
20b10 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
20b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20b30 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20b40 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
20b50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20b70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20b80 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20b90 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
20ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20bb0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
20bc0 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
20bd0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20be0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
20bf0 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
20c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
20c10 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
20c20 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
20c30 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
20c40 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
20c50 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
20c60 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
20c70 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
20c80 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
20c90 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
20ca0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
20cb0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
20cc0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
20cd0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
20ce0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
20cf0 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
20d00 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
20d10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20d20 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
20d30 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
20d40 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
20d50 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
20d60 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
20d70 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
20d80 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
20d90 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
20da0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
20db0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
20dc0 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
20dd0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
20de0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
20df0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
20e00 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
20e10 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
20e20 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn a;.}.int sql
20e30 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
20e40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20e50 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
20e60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20e70 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
20e80 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
20e90 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
20ea0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
20eb0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
20ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
20ed0 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
20ee0 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
20ef0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
20f00 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
20f10 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
20f20 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
20f30 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
20f40 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
20f50 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
20f60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
20f70 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65 67  int pagerStmtBeg
20f80 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
20f90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
20fa0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
20fb0 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
20fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20fd0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
20fe0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
20ff0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
21000 6c 69 64 20 29 3b 0a 20 20 50 41 47 45 52 54 52  lid );.  PAGERTR
21010 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
21020 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21030 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
21040 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
21050 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
21060 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
21070 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
21080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
210a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
210b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
210c0 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b  r->pInStmt==0 );
210d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  .  pPager->pInSt
210e0 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  mt = sqlite3Bitv
210f0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
21100 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  >dbSize);.  if( 
21110 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
21120 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
21130 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
21140 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
21150 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
21160 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21170 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
21180 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
21190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
211a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
211b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
211c0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
211d0 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
211e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
211f0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
21200 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
21210 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
21220 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
21230 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
21240 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21250 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
21260 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
21270 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
21280 74 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tfd);.    }else{
21290 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
212a0 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
212b0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
212c0 3e 73 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >stfd, SQLITE_OP
212d0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
212e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
212f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d          goto stm
21300 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
21310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21320 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
21330 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
21340 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
21350 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21360 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
21370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21380 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
21390 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
213a0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b  ager->pInStmt ){
213b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
213c0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
213d0 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->pInStmt);.    
213e0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
213f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21400 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
21410 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
21420 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
21430 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
21440 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
21450 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  n(pPager);.  ret
21460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21470 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
21480 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21490 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
214a0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
214b0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
214c0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
214d0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
214e0 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
214f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21500 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
21510 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
21520 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
21530 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
21540 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
21550 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
21560 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
21570 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
21580 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
21590 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
215a0 3e 73 74 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >stfd) ){.      
215b0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
215c0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
215d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
215e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
215f0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
21600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21610 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
21620 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
21630 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21640 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
21650 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
21660 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
21670 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
21680 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
21690 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
216a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
216b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 72 63  pPager));.    rc
216c0 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
216d0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
216e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
216f0 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
21700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
21710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21720 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
21730 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
21740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21760 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
21770 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21780 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
21790 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
217a0 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
217b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
217c0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
217d0 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
217e0 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
217f0 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
21800 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
21810 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
21820 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
21830 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21840 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
21850 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
21860 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
21870 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
21880 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
21890 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
218a0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
218b0 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
218c0 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
218d0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
218e0 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
218f0 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
21900 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
21910 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21920 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
21930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21940 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
21950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21960 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21970 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
21980 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
21990 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
219a0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
219b0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
219c0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
219d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
219e0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
219f0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
21a00 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
21a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21a20 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
21a30 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
21a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21a50 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
21a60 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
21a70 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
21a80 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
21a90 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
21aa0 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
21ab0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21ac0 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
21ad0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21ae0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
21af0 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
21b00 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
21b10 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
21b20 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
21b30 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
21b40 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
21b50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
21b60 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
21b70 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
21b80 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
21b90 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
21ba0 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
21bb0 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
21bc0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
21bd0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
21be0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
21bf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21c00 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
21c10 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
21c20 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
21c30 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
21c40 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
21c50 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
21c60 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
21c70 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
21c80 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
21c90 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
21ca0 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
21cb0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
21cc0 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
21cd0 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
21ce0 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
21cf0 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
21d00 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
21d10 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
21d20 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
21d30 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
21d40 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
21d50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
21d60 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
21d70 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
21d80 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
21d90 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
21da0 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
21db0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
21dc0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
21dd0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
21de0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
21df0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
21e00 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
21e10 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
21e20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
21e30 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
21e40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21e50 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
21e60 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
21e70 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
21e80 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
21e90 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
21ea0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
21eb0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
21ec0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
21ed0 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
21ee0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
21ef0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
21f00 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
21f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
21f20 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
21f30 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
21f40 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
21f50 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
21f60 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
21f70 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
21f80 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
21f90 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
21fa0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
21fb0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
21fc0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
21fd0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
21fe0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21ff0 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
22000 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
22010 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
22020 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
22030 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
22040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22050 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
22060 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
22070 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
22080 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b  , int isCommit){
22090 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
220a0 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
220b0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
220c0 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
220d0 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
220e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
220f0 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52  ef>0 );..  PAGER
22100 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
22110 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
22120 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
22130 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
22140 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22150 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
22160 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
22170 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
22180 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
22190 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
221a0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
221b0 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
221c0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
221d0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
221e0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
221f0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
22200 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
22210 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
22220 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
22230 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
22240 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
22250 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
22260 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
22270 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
22280 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
22290 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
222a0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
222b0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
222c0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
222d0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
222e0 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
222f0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
22300 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
22310 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
22320 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
22330 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
22340 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
22350 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
22360 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
22370 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
22380 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
22390 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
223a0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
223b0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
223c0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
223d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
223e0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
223f0 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
22400 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
22410 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
22420 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
22430 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
22440 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
22450 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
22460 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
22470 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
22480 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
22490 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
224a0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
224b0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
224c0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
224d0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
224e0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
224f0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
22500 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
22510 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
22520 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
22530 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
22540 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
22550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
22560 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
22570 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
22580 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
22590 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
225a0 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
225b0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
225c0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  }..  sqlite3Pcac
225d0 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f  heMove(pPg, pgno
225e0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
225f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
22600 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29  acheDrop(pPgOld)
22610 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
22620 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
22630 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
22640 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
22650 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
22660 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
22670 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
22680 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
22690 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
226a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
226b0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
226c0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
226d0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
226e0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
226f0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
22700 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
22710 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
22720 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
22730 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
22740 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
22750 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
22760 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
22770 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
22780 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
22790 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
227a0 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
227b0 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
227c0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
227d0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
227e0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
227f0 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
22800 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
22810 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
22820 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
22830 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
22840 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
22850 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
22860 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
22870 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
22880 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
22890 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
228a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
228b0 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
228c0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
228d0 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
228e0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
228f0 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
22900 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
22910 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
22920 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
22930 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
22940 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
22950 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
22960 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
22970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
22980 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
22990 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
229a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
229b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
229c0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
229d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
229e0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
229f0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
22a00 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
22a10 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
22a20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
22a30 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  ;.    PgHdr *pPg
22a40 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
22a50 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22a60 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
22a70 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
22a80 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
22a90 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
22aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
22ac0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
22ad0 6e 61 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50  nal && needSyncP
22ae0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
22af0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
22b00 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
22b10 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
22b20 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
22b30 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
22b40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
22b60 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
22b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22b80 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
22b90 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
22ba0 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
22bb0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
22bc0 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
22bd0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
22be0 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
22bf0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
22c00 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Hdr);.  }..  ret
22c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22c20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
22c30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22c40 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
22c50 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
22c60 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
22c70 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
22c80 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22c90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
22ca0 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
22cb0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
22cc0 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
22cd0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
22ce0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22cf0 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
22d00 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
22d10 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
22d20 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
22d30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
22d40 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
22d50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
22d60 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
22d70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22d80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
22d90 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
22da0 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b  ?pPg->pExtra:0);
22db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
22dc0 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
22dd0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
22de0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
22df0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
22e00 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
22e10 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
22e20 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22e30 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
22e40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22e50 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
22e60 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
22e70 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
22e80 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
22e90 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
22ea0 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
22eb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
22ec0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
22ed0 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
22ee0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
22ef0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
22f00 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
22f10 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
22f20 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
22f30 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
22f40 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
22f50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22f60 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
22f70 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
22f80 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
22f90 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
22fa0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
22fc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
22fd0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
22fe0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
22ff0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
23000 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
23020 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23030 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
23040 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
23050 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
23060 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
23070 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
23080 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
23090 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
230a0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
230b0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
230c0 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
230d0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
230e0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
230f0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
23100 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
23110 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
23120 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
23130 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
23140 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
23150 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
23160 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
23170 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
23180 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
23190 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
231a0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
231b0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
231c0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
231d0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
231e0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a  NALMODE_OFF.**.*
231f0 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
23200 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
23210 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
23220 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  al-mode is set t
23230 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  o the.** value s
23240 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
23250 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64  The returned ind
23260 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  icate the curren
23270 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
23280 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  ted).** journal-
23290 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
232a0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
232b0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
232c0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
232d0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
232e0 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
232f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23300 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
23310 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
23320 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23330 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
23340 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
23350 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
23360 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
23380 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
23390 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
233a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
233b0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
233c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
233e0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
233f0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
23400 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23410 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23420 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20  E_QUERY<0 );.   
23430 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
23440 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23450 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
23460 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73  )eMode;.    }els
23470 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
23480 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
23490 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
234a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
234b0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
234c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
234d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
234e0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
234f0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
23500 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
23510 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
23520 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
23530 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
23540 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
23550 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
23560 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
23570 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
23580 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
23590 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
235a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
235b0 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  mit;.}..#endif /
235c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
235d0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.