/ Hex Artifact Content
Login

Artifact 8377118bd5ae055b66683926b264f6c04442317e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 39  : pager.c,v 1.49
0350: 39 20 32 30 30 38 2f 31 30 2f 32 32 20 31 36 3a  9 2008/10/22 16:
0360: 32 36 3a 34 38 20 73 68 61 6e 65 20 45 78 70 20  26:48 shane Exp 
0370: 24 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  $.*/.#ifndef SQL
0380: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0390: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
03a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
03b0: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
03c0: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
03d0: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03e0: 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20  /.#if 0.#define 
03f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0400: 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e  tf printf.#defin
0410: 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58 29  e PAGERTRACE1(X)
0420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
0430: 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65  bugPrintf(X).#de
0440: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
0450: 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65  (X,Y)     sqlite
0460: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0470: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0480: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
0490: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04a0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04b0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
04f0: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
0500: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0510: 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23  ntf(X,Y,Z,W,V).#
0520: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
0530: 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65 66  ERTRACE1(X).#def
0540: 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28  ine PAGERTRACE2(
0550: 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47  X,Y).#define PAG
0560: 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a  ERTRACE3(X,Y,Z).
0570: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0580: 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  CE4(X,Y,Z,W).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 35  fine PAGERTRACE5
05a0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64  (X,Y,Z,W,V).#end
05b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
05c0: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
05d0: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
05e0: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
05f0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
0600: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0610: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0620: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0630: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0640: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0650: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
0660: 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61  gument. The.** a
0670: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64  ssociated file-d
0680: 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74  escriptor is ret
0690: 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c  urned. FILEHANDL
06a0: 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73  EID() takes an s
06b0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73  qlite3_file.** s
06c0: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
06d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ument..*/.#defin
06e0: 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69  e PAGERID(p) ((i
06f0: 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66  nt)(p->fd)).#def
0700: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0710: 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a  (fd) ((int)fd)..
0720: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  /*.** The page c
0730: 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20  ache as a whole 
0740: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65  is always in one
0750: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0760: 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  g.** states:.**.
0770: 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43  **   PAGER_UNLOC
0780: 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  K        The pag
0790: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63  e cache is not c
07a0: 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67  urrently reading
07b0: 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   or .**         
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
07d0: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
07e0: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20  se file.  There 
07f0: 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  is no.**        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0810: 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  ata held in memo
0820: 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ry.  This is the
0830: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20   initial.**     
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
0860: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
0870: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0880: 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74  che is reading t
0890: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73        Writing is
08c0: 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
08d0: 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   There 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 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
0900: 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e  readers accessin
0910: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
0920: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
0940: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0950: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  me..**.**   PAGE
0960: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20  R_RESERVED      
0970: 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73  This process has
0980: 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61   reserved the da
0990: 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69  tabase for writi
09a0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
09c0: 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  has not yet made
09d0: 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f   any changes.  O
09e0: 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a  nly one process.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69           at a ti
0a10: 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74  me can reserve t
0a20: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
0a30: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0a60: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
0a70: 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72  odified so other
0a80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a90: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0aa0: 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  ses may still be
0ab0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d   reading the on-
0ac0: 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  disk.**         
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0ae0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
0af0: 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55  **   PAGER_EXCLU
0b00: 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67  SIVE     The pag
0b10: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0b20: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0b30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b40: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0b50: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0b60: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0b70: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0b90: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0ba0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0bb0: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0be0: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  riting..**.**   
0bf0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
0c00: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f      The pager mo
0c10: 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74  ves to this stat
0c20: 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43  e from PAGER_EXC
0c30: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20  LUSIVE.**       
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20  after all dirty 
0c60: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0c70: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
0c80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c90: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0ca0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
0cb0: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
0cc0: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0ce0: 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65  isk. All that re
0cf0: 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74  mains to do is t
0d00: 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20  o remove or.**  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74 68       truncate th
0d30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
0d40: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d50: 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  on .**          
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c               wil
0d70: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  l be committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0dd0: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0de0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0df0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e00: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e10: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e20: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e30: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e40: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e60: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e70: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e80: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e90: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ea0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0eb0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ec0: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0ed0: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0ee0: 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  hat sqlite3Pager
0ef0: 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  Write() can only
0f00: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f10: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f20: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f30: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f40: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f50: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0f60: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0f70: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0f80: 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45  ED.).** PAGER_RE
0f90: 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61  SERVED means tha
0fa0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70  t there is an op
0fb0: 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  en rollback jour
0fc0: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e  nal..** The tran
0fd0: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
0fe0: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
0ff0: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1000: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
1010: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1020: 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69  file, though wri
1030: 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  tes to the rollb
1040: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f  ack.** journal o
1050: 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74 20  ccurs with just 
1060: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
1070: 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65   After an sqlite
1080: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1090: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61  .** or sqlite3Pa
10a0: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
10b0: 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 63  o(), the state c
10c0: 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41  an go back to PA
10d0: 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f  GER_SHARED,.** o
10e0: 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61 74  r it can stay at
10f0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1100: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65 78   if we are in ex
1110: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
1120: 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ode..*/.#define 
1130: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
1140: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
1150: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20  R_SHARED      1 
1160: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41    /* same as SHA
1170: 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  RED_LOCK */.#def
1180: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
1190: 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d  ED    2   /* sam
11a0: 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f  e as RESERVED_LO
11b0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
11c0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
11d0: 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45  4   /* same as E
11e0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f  XCLUSIVE_LOCK */
11f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1200: 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a  YNCED      5../*
1210: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
1220: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1230: 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65  LOCK macro is se
1240: 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d  t to true at com
1250: 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68  pile-time,.** th
1260: 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70  en failed attemp
1270: 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73 65  ts to get a rese
1280: 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69  rved lock will i
1290: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
12a0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
12b0: 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75   is off by defau
12c0: 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c  lt.  To see why,
12d0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
12e0: 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
12f0: 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65  :.** .** Suppose
1300: 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61 64   thread A alread
1310: 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  y has a shared l
1320: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20  ock and wants a 
1330: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a  reserved lock..*
1340: 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65 61  * Thread B alrea
1350: 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76 65  dy has a reserve
1360: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
1370: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1380: 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20  ck.  If.** both 
1390: 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69 6e  threads are usin
13a0: 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61 6c  g their busy cal
13b0: 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74  lbacks, it might
13c0: 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a   be a long time.
13d0: 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ** be for one of
13e0: 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69 76   the threads giv
13f0: 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20  e up and allows 
1400: 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f  the other to pro
1410: 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20  ceed..** But if 
1420: 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69 6e  the thread tryin
1430: 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 73  g to get the res
1440: 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73  erved lock gives
1450: 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28   up quickly.** (
1460: 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f  if it never invo
1470: 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61 6c  kes its busy cal
1480: 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20  lback) then the 
1490: 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20  contention will 
14a0: 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71  be.** resolved q
14b0: 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64  uickly..*/.#ifnd
14c0: 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ef SQLITE_BUSY_R
14d0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64  ESERVED_LOCK.# d
14e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53  efine SQLITE_BUS
14f0: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1500: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1510: 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64  This macro round
1520: 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74  s values up so t
1530: 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  hat if the value
1540: 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69   is an address i
1550: 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65  t.** is guarante
1560: 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72  ed to be an addr
1570: 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67  ess that is alig
1580: 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65  ned to an 8-byte
1590: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64   boundary..*/.#d
15a0: 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47  efine FORCE_ALIG
15b0: 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29  NMENT(X)   (((X)
15c0: 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41  +7)&~7)../*.** A
15d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
15e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
15f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1600: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1610: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1620: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1630: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
1640: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
1650: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
1660: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
1670: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
1680: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
1690: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
16a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
16b0: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
16c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
16d0: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
16e0: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
16f0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
1700: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
1710: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  if../*.** A open
1720: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
1730: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1750: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  cture..**.** Pag
1760: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
1770: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
1780: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
1790: 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20  RRUPT, or.** or 
17a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63  SQLITE_FULL. Onc
17b0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72  e one of the fir
17c0: 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20  st three errors 
17d0: 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69  occurs, it persi
17e0: 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65  sts.** and is re
17f0: 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65  turned as the re
1800: 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61  sult of every ma
1810: 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61  jor pager API ca
1820: 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  ll.  The.** SQLI
1830: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1840: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1850: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1860: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1870: 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75  l the.** next su
1880: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
1890: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
18a0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
18b0: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49  e. Also,.** SQLI
18c0: 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74  TE_FULL does not
18d0: 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69   affect the sqli
18e0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e  te3PagerGet() an
18f0: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  d sqlite3PagerLo
1900: 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20  okup().** APIs, 
1910: 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62  they may still b
1920: 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75  e used successfu
1930: 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  lly..*/.struct P
1940: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
1950: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1960: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
1970: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
1980: 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  IO */.  u8 journ
1990: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
19a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
19b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
19c0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
19d0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
19e0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
19f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
1a00: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
1a10: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
1a20: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
1a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1a40: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1a50: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
1a60: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
1a70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1a80: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1a90: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
1aa0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
1ab0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ad0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
1ae0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
1af0: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
1b00: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
1b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
1b20: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
1b30: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1b40: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
1b50: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
1b60: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
1b70: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
1b80: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
1b90: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
1ba0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1bb0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
1bc0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
1bd0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
1be0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
1c00: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
1c10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
1c20: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
1c30: 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20  sync_flags;     
1c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1c50: 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  of SYNC_NORMAL o
1c60: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20  r SYNC_FULL */. 
1c70: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c90: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
1ca0: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
1cb0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74  , etc. */.  u8 t
1cc0: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
1cd0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
1ce0: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
1cf0: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
1d00: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
1d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d20: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
1d30: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1d40: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d60: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
1d70: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
1d80: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1d90: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1db0: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
1dc0: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
1dd0: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1de0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1df0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1e00: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1e10: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  all pages */.  u
1e20: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
1e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e40: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
1e50: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20  l file I/O */.  
1e60: 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20  u8 setMaster;   
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e80: 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d  rue if a m-j nam
1e90: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
1ea0: 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20  en to jrnl */.  
1eb0: 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20  u8 doNotSync;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1ed0: 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72  oolean. While tr
1ee0: 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c  ue, do not spill
1ef0: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
1f00: 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  u8 exclusiveMode
1f10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
1f20: 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
1f30: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58  locking_mode==EX
1f40: 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20  CLUSIVE */.  u8 
1f50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20  journalMode;    
1f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f           /* On o
1f70: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
1f80: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
1f90: 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66   */.  u8 dbModif
1fa0: 69 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ied;            
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 72 65 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67  re are any chang
1fd0: 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a  es to the Db */.
1fe0: 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74    u8 changeCount
1ff0: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Done;         /*
2000: 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65   Set after incre
2010: 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e  menting the chan
2020: 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ge-counter */.  
2030: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
2040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2050: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
2060: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2070: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2090: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
20a0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
20b0: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20e0: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
20f0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2100: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2110: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2120: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2130: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2140: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2150: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2160: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2170: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2180: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
21a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21b0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
21c0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21d0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
21e0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
21f0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2200: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2210: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2220: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2240: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2250: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2260: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2270: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2280: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2290: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
22a0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
22b0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
22c0: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
22d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
22f0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2300: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2310: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2320: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2330: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2340: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2360: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2370: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2380: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
2390: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
23a0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23b0: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
23c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
23d0: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a  /.  Bitvec *pInJ
23e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
23f0: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
2400: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
2410: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2420: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74  .  Bitvec *pInSt
2430: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
2440: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2450: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2460: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42 69 74  atabase */.  Bit
2470: 76 65 63 20 2a 70 41 6c 77 61 79 73 52 6f 6c 6c  vec *pAlwaysRoll
2480: 62 61 63 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65 20  back;    /* One 
2490: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
24a0: 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 2d  e marked always-
24b0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63 68  rollback */.  ch
24c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
24f0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2500: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
2510: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2520: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2530: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2540: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
2550: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2560: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
2570: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
2580: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  s */.  sqlite3_f
2590: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
25a0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
25b0: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
25c0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
25d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
25e0: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
25f0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2600: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
2610: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
2620: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
2630: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
2640: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2650: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
2660: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  r */.  i64 journ
2670: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
2680: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2690: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
26a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
26b0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
26c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
26d0: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
26e0: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
26f0: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
2700: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
2710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2720: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
2730: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
2740: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
2750: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
2770: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
2780: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
2790: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
27a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
27b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
27c0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
27d0: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
27e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
27f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
2800: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
2810: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
2820: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2830: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
2840: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
2850: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
2860: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
2870: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
2880: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
2890: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
28a0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
28b0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
28c0: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
28d0: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
28e0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
28f0: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2910: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
2920: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2930: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2940: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
2950: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
2960: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
2970: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
2980: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
2990: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
29a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
29b0: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
29d0: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
29e0: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
29f0: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
2a00: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
2a10: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
2a20: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
2a30: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
2a40: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2a50: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
2a60: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
2a70: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
2a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
2a90: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
2aa0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2ab0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
2ac0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
2ad0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
2ae0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
2af0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
2b00: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
2b10: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
2b20: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
2b30: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
2b40: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
2b50: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
2b60: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
2b70: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
2b80: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
2b90: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2ba0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2bb0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
2bc0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
2bd0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
2be0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
2bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2c00: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
2c10: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
2c20: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
2c30: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
2c40: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2c50: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
2c60: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
2c70: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2c80: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
2c90: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2ca0: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
2cb0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
2cc0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
2cd0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2ce0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2cf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2d00: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2d10: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2d20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2d30: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
2d40: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
2d50: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
2d60: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
2d70: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
2d80: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
2d90: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
2da0: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2db0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
2dc0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
2dd0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
2de0: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
2df0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2e00: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2e10: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2e20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
2e30: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
2e40: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2e50: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2e60: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2e70: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2e80: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2e90: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
2ea0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
2eb0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
2ec0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
2ed0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
2ee0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
2ef0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2f00: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2f10: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2f20: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2f30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2f40: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
2f50: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2f60: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2f70: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
2f80: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
2f90: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
2fa0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
2fb0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
2fc0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
2fd0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
2fe0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
2ff0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3000: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3010: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
3020: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
3030: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
3040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
3050: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
3060: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
3070: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3080: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3090: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
30a0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
30b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
30c0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
30d0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
30e0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
30f0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3100: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3110: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
3120: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
3130: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
3140: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
3150: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
3160: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
3170: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3180: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3190: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
31a0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
31b0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
31c0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
31d0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
31e0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
31f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3200: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3210: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
3220: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
3230: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3240: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
3250: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3260: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
3270: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3280: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
3290: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
32a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
32b0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
32c0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
32d0: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
32e0: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
3300: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
3310: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
3320: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
3330: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
3340: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
3350: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
3360: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
3370: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
3380: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
3390: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
33a0: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
33b0: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
33c0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
33d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
33e0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
33f0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
3400: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
3410: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
3420: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
3430: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
3440: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
3450: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
3460: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
3470: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
3480: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
3490: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
34a0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
34b0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
34c0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
34d0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
34e0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
34f0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
3500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
3510: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
3520: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
3530: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
3540: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
3550: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
3560: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3570: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3580: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3590: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
35a0: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
35b0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
35c0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
35d0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
35e0: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
35f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3600: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3610: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3620: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3630: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3640: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3650: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3660: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3670: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3680: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3690: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
36a0: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
36b0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
36c0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
36d0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
36e0: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
36f0: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3700: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3710: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3720: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3730: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3740: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
3750: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
3760: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
3770: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
3780: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
3790: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
37a0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
37b0: 66 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20  f page *pPg has 
37c0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
37d0: 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tten to the stat
37e0: 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ement.** journal
37f0: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73   (or statement s
3800: 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e  napshot has been
3810: 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50   created, if *pP
3820: 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  g is part.** of 
3830: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
3840: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
3850: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74  c int pageInStat
3860: 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ement(PgHdr *pPg
3870: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
3880: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
3890: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
38a0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
38b0: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
38c0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
38d0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
38e0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
38f0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3900: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
3910: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
3920: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
3930: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
3940: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
3950: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
3960: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
3970: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
3980: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
3990: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
39a0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
39b0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
39c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
39d0: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
39e0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
39f0: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
3a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3a10: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
3a20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
3a30: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
3a40: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
3a50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3a60: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
3a70: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
3a80: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
3a90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3aa0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3ab0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
3ac0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
3ad0: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
3ae0: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
3af0: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
3b00: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
3b10: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
3b20: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3b30: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
3b40: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3b50: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3b60: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3b70: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3b80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3b90: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
3ba0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
3bb0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
3bc0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
3bd0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
3be0: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
3bf0: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
3c00: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
3c10: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
3c20: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
3c30: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  et);.}../*.** If
3c40: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
3c50: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
3c60: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
3c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
3c80: 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
3c90: 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65  file *pFd, int e
3ca0: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46  Lock){.  if( !pF
3cb0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
3cc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3cd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
3ce0: 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  n sqlite3OsUnloc
3cf0: 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  k(pFd, eLock);.}
3d00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3d10: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
3d20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
3d30: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
3d40: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
3d50: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
3d60: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
3d70: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
3d80: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
3d90: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
3da0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3db0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
3dc0: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
3dd0: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
3de0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
3df0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
3e00: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
3e10: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
3e20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
3e30: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
3e40: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
3e50: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
3e60: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
3e70: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
3e80: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
3e90: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
3ea0: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
3eb0: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
3ec0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
3ed0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
3ee0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
3ef0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
3f00: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
3f10: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
3f20: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
3f30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3f40: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
3f60: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
3f70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
3f80: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   dc;           /
3f90: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
3fa0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  eristics */.  in
3fb0: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
3fc0: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
3fd0: 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20  /.  int szPage; 
3fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
3ff0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
4000: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
4010: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
4020: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
4030: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
4040: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
4050: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
4060: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
4070: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
4080: 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  );.    szPage = 
4090: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
40a0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
40b0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
40c0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
40d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
40e0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
40f0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
4100: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
4110: 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20  thods || .      
4120: 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49   (dc & (SQLITE_I
4130: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
4140: 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63  age>>8)) && nSec
4150: 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a  tor<=szPage) ){.
4160: 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e      return JOURN
4170: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4180: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
4190: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
41a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
41b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
41c0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
41d0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
41e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
41f0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4200: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4210: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4220: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4230: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4240: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4250: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4260: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4270: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4280: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4290: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
42a0: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
42b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
42c0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
42d0: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
42e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
42f0: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4300: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4310: 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46  UPT, or SQLITE_F
4320: 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ULL.** the error
4330: 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
4340: 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70  ent. Until the p
4350: 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69  ersisten error i
4360: 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75  s cleared,.** su
4370: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
4380: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
4390: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
43a0: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
43b0: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
43c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73  ..**.** A persis
43d0: 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63  tent error indic
43e0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
43f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
4400: 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
4410: 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
4420: 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
4430: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
4440: 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
4450: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
4460: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
4470: 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
4480: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
4490: 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
44a0: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
44b0: 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20  r occured, then 
44c0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
44d0: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
44e0: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e   to be replayed.
44f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4500: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
4510: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61  er *pPager);.sta
4520: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
4530: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
4540: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
4550: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
4560: 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  f;.  assert(.   
4570: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4580: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
4590: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
45a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
45b0: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
45c0: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
45d0: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
45e0: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
45f0: 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  (.    rc2==SQLIT
4600: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63  E_FULL ||.    rc
4610: 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
4620: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
4630: 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a  TE_CORRUPT.  ){.
4640: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4650: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  ode = rc;.    if
4660: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
4670: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
4680: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
4690: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
46a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
46b0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
46c0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
46d0: 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b  s already unlock
46e0: 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75  ed, call pager_u
46f0: 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20  nlock() now to. 
4700: 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68       ** clear th
4710: 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
4720: 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  d ensure that th
4730: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73  e pager-cache is
4740: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c   .      ** compl
4750: 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20  etely empty..   
4760: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65     */.      page
4770: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
4780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4790: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
47a0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
47b0: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
47c0: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
47d0: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
47e0: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
47f0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
4800: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
4810: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
4820: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
4830: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
4840: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4850: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4860: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4870: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4880: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4890: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
48a0: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
48b0: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
48c0: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
48d0: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
48e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
48f0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
4900: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
4910: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
4920: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4930: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
4940: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
4950: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
4960: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
4970: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
4980: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4990: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
49a0: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
49b0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  );.}.static u32 
49c0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
49d0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
49e0: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
49f0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
4a00: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
4a10: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
4a20: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
4a30: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
4a40: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
4a50: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4a60: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
4a70: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
4a80: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
4a90: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
4aa0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
4ab0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
4ac0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
4ad0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
4ae0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
4af0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
4b00: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
4b10: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
4b20: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
4b30: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
4b40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
4b50: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
4b60: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
4b70: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
4b80: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20  rrCode.      || 
4b90: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
4ba0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
4bb0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
4bc0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
4bd0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
4be0: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
4bf0: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
4c00: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
4c10: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
4c20: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
4c30: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
4c40: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
4c50: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4c60: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4c70: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4c80: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4c90: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4ca0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4cb0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
4cc0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
4cd0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
4ce0: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
4cf0: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62  emory supplied b
4d00: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a  y the caller. .*
4d10: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
4d20: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
4d30: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
4d40: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
4d50: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
4d60: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
4d70: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
4d80: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
4d90: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
4da0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
4db0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
4dc0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4dd0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
4de0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
4df0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
4e00: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
4e10: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
4e20: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
4e30: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
4e40: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
4e50: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
4e60: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
4e70: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
4e80: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
4e90: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
4ea0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
4eb0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
4ec0: 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d  esent zMaster[0]
4ed0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4ee0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
4ef0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
4f00: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
4f10: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
4f20: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
4f30: 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20  r *zMaster, int 
4f40: 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  nMaster){.  int 
4f50: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
4f60: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
4f70: 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75 3b 20  cksum;.  u32 u; 
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
4fa0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
4fb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
4fc0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
4fd0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
4fe0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
4ff0: 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  ..  zMaster[0] =
5000: 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73   '\0';..  rc = s
5010: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
5020: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
5030: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5040: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
5050: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5060: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5070: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
5080: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5090: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
50a0: 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d  rc;..  if( len>=
50b0: 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  nMaster ){.    r
50c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
50d0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
50e0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
50f0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
5100: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5110: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5120: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5130: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5140: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
5150: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5160: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5170: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5180: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5190: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
51a0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
51b0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
51c0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
51d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
51e0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
51f0: 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  rc;.  }.  zMaste
5200: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a  r[len] = '\0';..
5210: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
5220: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
5230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5240: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
5250: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
5260: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
5270: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 20   zMaster[u];.   
5280: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5290: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
52a0: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
52b0: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
52c0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
52d0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
52e0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
52f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5300: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5310: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5320: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
5330: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
5340: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
5350: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
5360: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
5370: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5380: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5390: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b   */.    zMaster[
53a0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
53b0: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
53c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
53d0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
53e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
53f0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5400: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
5410: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
5420: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
5430: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
5440: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
5450: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
5460: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
5470: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
5480: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
5490: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
54a0: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
54c0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
5580: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
5590: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
55a0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
55b0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
55c0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
55d0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
55e0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
55f0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
5600: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5610: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
5620: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
5630: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
5640: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
5650: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
5660: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5670: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
5680: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
5690: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
56a0: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
56b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
56c0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  fset;.}../*.** W
56d0: 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20  rite zeros over 
56e0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
56f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
5700: 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a   This has the.**
5710: 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c   effect of inval
5720: 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  idating the jour
5730: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d  nal file and com
5740: 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74  mitting the.** t
5750: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5760: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
5770: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
5780: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
5790: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
57a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
57b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
57c0: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
57d0: 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70 50 61   {0};..  if( pPa
57e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
57f0: 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69  ){.    i64 iLimi
5800: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
5810: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20  nalSizeLimit;.. 
5820: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
5830: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
5840: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
5850: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
5860: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
5870: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
5880: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
5890: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
58a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
58b0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
58c0: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
58d0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
58e0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
58f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5900: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
5910: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
5920: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
5930: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
5940: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
5950: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
5960: 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  _flags);.    }..
5970: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
5980: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
5990: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
59a0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
59b0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
59c0: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
59d0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
59e0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
59f0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
5a00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
5a10: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
5a20: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
5a30: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
5a40: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
5a50: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
5a60: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
5a70: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
5a80: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
5a90: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
5aa0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
5ab0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
5ac0: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
5ad0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5ae0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
5af0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
5b00: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
5b10: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5b20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
5b30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
5b50: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
5b60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5b70: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
5b80: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
5b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5ba0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5bb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
5bc0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
5bd0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
5be0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5bf0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
5c00: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
5c10: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
5c20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
5c30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5c40: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
5c50: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
5c60: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
5c70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5c80: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
5c90: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
5ca0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
5cb0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
5cc0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5cd0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
5ce0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
5cf0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
5d00: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
5d10: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
5d20: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
5d30: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
5d40: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
5d50: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
5d60: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
5d70: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
5d80: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
5d90: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
5da0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
5db0: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
5dc0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
5dd0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
5de0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
5df0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
5e00: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
5e10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
5e20: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5e30: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
5e40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5e50: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
5e60: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
5e70: 61 63 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  ace;.  int nHead
5e80: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
5e90: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72  eSize;.  int nWr
5ea0: 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61  ite;..  if( nHea
5eb0: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
5ec0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
5ed0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
5ee0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5ef0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
5f00: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
5f10: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
5f20: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
5f30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f40: 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b  Off;.  }..  seek
5f50: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5f60: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  r);.  pPager->jo
5f70: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5f80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
5f90: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
5fa0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5fb0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
5fc0: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
5fd0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
5fe0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
5ff0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
6000: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
6010: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
6020: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
6030: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
6040: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
6050: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
6060: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
6070: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
6080: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
6090: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
60a0: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
60b0: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
60c0: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
60d0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
60e0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
60f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
6100: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
6110: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
6120: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
6130: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
6140: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
6150: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
6160: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
6170: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
6180: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
6190: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
61a0: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
61b0: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
61c0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
61d0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
61e0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
61f0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
6200: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
6210: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
6220: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
6230: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
6240: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
6250: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
6260: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
6270: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
6280: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
6290: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
62a0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
62b0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
62c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
62d0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
62e0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
62f0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
6300: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
6310: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
6320: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
6330: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
6340: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
6350: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
6360: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
6370: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
6380: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
6390: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
63a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
63b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  */.  assert(pPag
63c0: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
63d0: 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ||pPager->noSync
63e0: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
63f0: 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50  ->noSync) || (pP
6400: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
6410: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
6420: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
6430: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
6440: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
6450: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
6460: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
6470: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
6480: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
6490: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
64a0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
64b0: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
64c0: 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74  se{.    put32bit
64d0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
64e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
64f0: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ], 0);.  }..  /*
6500: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
6510: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
6520: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
6530: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6540: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6550: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6560: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6570: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6580: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6590: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
65a0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
65b0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
65c0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
65d0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
65e0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
65f0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
6600: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
6610: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
6620: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6630: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6640: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6650: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6660: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6670: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6680: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
6690: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d  ger->journalHdr=
66a0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
66b0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
66c0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
66d0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
66e0: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
66f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
6700: 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57  );.  }..  for(nW
6710: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
6720: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
6730: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6740: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
6750: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
6760: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
6770: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
6780: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
6790: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
67a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
67b0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
67c0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
67d0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
67e0: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
67f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6800: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
6810: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
6820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
6830: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
6840: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
6850: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
6860: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
6870: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
6880: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
6890: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
68a0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
68b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
68c0: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
68d0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
68e0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
68f0: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
6900: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
6910: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6920: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
6930: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
6940: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
6950: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
6960: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
6970: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
6980: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
6990: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
69a0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
69b0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
69c0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
69d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
69e0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
69f0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
6a00: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
6a10: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
6a20: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6a30: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
6a40: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6a50: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
6a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
6a70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6a80: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
6a90: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6aa0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6ab0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6ac0: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6ad0: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6ae0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6af0: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
6b00: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
6b10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
6b20: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6b30: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
6b40: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
6b50: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
6b60: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
6b70: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
6b80: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
6b90: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6ba0: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6bb0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6bc0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6bd0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6be0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a  eader */.  i64 j
6bf0: 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50  rnlOff;.  int iP
6c00: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b  ageSize;..  seek
6c10: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6c20: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
6c30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6c40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6c50: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6c60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6c70: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6c80: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
6c90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6ca0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6cb0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6cc0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6cd0: 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  of(aMagic), jrnl
6ce0: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Off);.  if( rc )
6cf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
6d00: 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28  nlOff += sizeof(
6d10: 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20  aMagic);..  if( 
6d20: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
6d30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6d40: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
6d50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6d60: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6d70: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6d80: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6d90: 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b  jrnlOff, pNRec);
6da0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6db0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
6dc0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6dd0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34  ->jfd, jrnlOff+4
6de0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6df0: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6e00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e10: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
6e30: 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29  lOff+8, pDbSize)
6e40: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6e50: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6e60: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6e70: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
6e80: 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67  16, (u32 *)&iPag
6e90: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
6ea0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
6eb0: 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31  && iPageSize>=51
6ec0: 32 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69  2 .   && iPageSi
6ed0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
6ee0: 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20  AGE_SIZE .   && 
6ef0: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
6f00: 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20  PageSize)==0 .  
6f10: 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 73  ){.    u16 pages
6f20: 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b  ize = iPageSize;
6f30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6f40: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
6f50: 65 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73  e(pPager, &pages
6f60: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
6f70: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6f80: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6f90: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6fa0: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6fb0: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6fc0: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6fd0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6fe0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6ff0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
7000: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
7010: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
7020: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
7030: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7040: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
7050: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
7060: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
7070: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
7080: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
7090: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
70a0: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
70b0: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
70c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
70d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
70e0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
70f0: 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50  f+12, (u32 *)&pP
7100: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
7110: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
7120: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
7130: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
7140: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
7150: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
7160: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7170: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
7180: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
7190: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
71a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
71b0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
71c0: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
71d0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
71e0: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
71f0: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
7200: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
7210: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
7220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7230: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
7240: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
7250: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
7260: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7270: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
7280: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
7290: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
72a0: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
72b0: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
72c0: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
72d0: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
72e0: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
72f0: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
7300: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7310: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
7320: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
7330: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
7340: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
7350: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
7360: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
7370: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
7380: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
7390: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
73a0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
73b0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
73c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a  ournal name..**.
73d0: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
73e0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
73f0: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
7400: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
7410: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
7420: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
7430: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7440: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
7450: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
7460: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
7470: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
7480: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  t rc;.  int len;
7490: 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36   .  int i; .  i6
74a0: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34  4 jrnlOff;.  i64
74b0: 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32   jrnlSize;.  u32
74c0: 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68   cksum = 0;.  ch
74d0: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61  ar zBuf[sizeof(a
74e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a  JournalMagic)+2*
74f0: 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  4];..  if( !zMas
7500: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
7510: 65 74 4d 61 73 74 65 72 20 29 20 72 65 74 75 72  etMaster ) retur
7520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7530: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7540: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
7550: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
7560: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7570: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
7580: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
7590: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
75a0: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
75b0: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
75c0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
75d0: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
75e0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
75f0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
7600: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
7610: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
7620: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
7630: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7640: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
7650: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
7660: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
7670: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
7680: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
7690: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
76a0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
76b0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
76c0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
76d0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72  Pager);.  }.  jr
76e0: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
76f0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
7700: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7710: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
7720: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
7730: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
7740: 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  rnlOff, PAGER_MJ
7750: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
7760: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7770: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7780: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b  .  jrnlOff += 4;
7790: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
77a0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
77b0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
77c0: 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  n, jrnlOff);.  i
77d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
77e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
77f0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a  jrnlOff += len;.
7800: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7810: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7820: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7830: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7840: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7850: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7860: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7870: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7880: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7890: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
78a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
78b0: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a  ), jrnlOff);.  j
78c0: 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65  rnlOff += 8+size
78d0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
78e0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
78f0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
7900: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
7910: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
7920: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
7930: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
7940: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
7950: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
7960: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
7970: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
7980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
7990: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
79a0: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
79b0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
79c0: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
79d0: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
79e0: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
79f0: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
7a00: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
7a10: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
7a20: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
7a30: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
7a40: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
7a50: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
7a60: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
7a70: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
7a80: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
7a90: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
7aa0: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
7ab0: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
7ac0: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
7ad0: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
7ae0: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
7af0: 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49  .  if( (rc==SQLI
7b00: 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63  TE_OK).   && (rc
7b10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
7b20: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
7b30: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53  , &jrnlSize))==S
7b40: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a  QLITE_OK.   && j
7b50: 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a  rnlSize>jrnlOff.
7b60: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
7b70: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
7b80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7b90: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
7ba0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7bb0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
7bc0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
7bd0: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
7be0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
7bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7c00: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7c10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7c20: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7c30: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7c40: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7c50: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7c60: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
7c70: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
7c80: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
7c90: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
7ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
7cb0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
7cc0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
7cd0: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
7ce0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
7cf0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
7d00: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
7d10: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
7d20: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
7d30: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
7d40: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
7d50: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
7d60: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
7d70: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
7d80: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
7d90: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
7da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7db0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
7dc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
7dd0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
7de0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
7df0: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
7e00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
7e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
7e20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7e30: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
7e40: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
7e50: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
7e60: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
7e70: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
7e80: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
7e90: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
7ea0: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
7eb0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
7ec0: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
7ed0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
7ee0: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
7ef0: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
7f00: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
7f10: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
7f20: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
7f30: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
7f40: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
7f50: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
7f60: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
7f70: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
7f80: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
7f90: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7fa0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
7fb0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
7fd0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
7fe0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
7ff0: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67     if( rc ) pPag
8000: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
8010: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
8020: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 49  Size = -1;.    I
8030: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
8040: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
8050: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
8060: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
8070: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
8080: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
8090: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
80a0: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
80b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
80c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
80d0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
80e0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
80f0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
8100: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
8110: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
8120: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
8130: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8140: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8150: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8160: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8170: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
8180: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
8190: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
81a0: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
81b0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
81c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
81d0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
81e0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
81f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
8200: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8210: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
8220: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
8230: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
8240: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
8250: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
8260: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
8270: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
8280: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
8290: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
82a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
82b0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
82c0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
82d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
82e0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
82f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
8300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
8310: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
8320: 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72  LITE_OK ) pPager
8330: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
8340: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61 67  TE_OK;.      pag
8350: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
8360: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
8370: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
8380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
8390: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
83a0: 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tfd);.        sq
83b0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
83c0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
83d0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  mt);.        pPa
83e0: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
83f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8400: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
8410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8420: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
8430: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
8440: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
8450: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8460: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
8470: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
8480: 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
8490: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
84a0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
84b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
84c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
84d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
84e0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
84f0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  tDone = 0;.  }.}
8500: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
8510: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
8530: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
8540: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
8550: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
8560: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
8570: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
8580: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
8590: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
85a0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
85b0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
85c0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
85d0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
85e0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
85f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
8600: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
8610: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
8620: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
8630: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
8640: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
8650: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
8660: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
8670: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
8680: 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  lock(p);.}../*.*
8690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
86a0: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
86b0: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
86c0: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
86d0: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
86e0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
86f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
8700: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8710: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
8720: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8730: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
8740: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
8750: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
8760: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
8770: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
8780: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
8790: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
87a0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
87b0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
87c0: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
87d0: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
87e0: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
87f0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
8800: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
8810: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
8820: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
8830: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
8840: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
8850: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
8860: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
8870: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
8880: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
8890: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
88a0: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
88b0: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
88c0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
88d0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
88e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
88f0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
8900: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
8910: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
8920: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
8930: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
8940: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
8950: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
8960: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
8970: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
8980: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
8990: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
89a0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
89b0: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
89c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
89d0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
89e0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
89f0: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
8a00: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8a10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a20: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
8a30: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
8a40: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
8a50: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
8a60: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63   && !pPager->exc
8a70: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
8a80: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8a90: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
8aa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8ab0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
8ac0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
8ad0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69  nalOpen ){.    i
8ae0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8af0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8b00: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
8b10: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
8b20: 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20  MemoryJournal = 
8b30: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
8b40: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  nal(pPager->jfd)
8b50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8b60: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
8b70: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8b80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8b90: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69   0;.      if( !i
8ba0: 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29  sMemoryJournal )
8bb0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8bc0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8bd0: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
8be0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
8bf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8c00: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8c10: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8c20: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8c30: 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20  TRUNCATE.       
8c40: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
8c50: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
8c60: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
8c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8c80: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8c90: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
8ca0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
8cb0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
8cc0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
8cd0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8ce0: 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
8cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8d10: 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20  PERSIST.    ){. 
8d20: 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
8d30: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
8d40: 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
8d50: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
8d60: 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
8d70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8d80: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
8d90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
8da0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
8db0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
8dc0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
8dd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
8de0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
8df0: 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20  TE || rc );.    
8e00: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8e10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
8e20: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8e30: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
8e40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8e50: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
8e60: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
8e70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8e80: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
8e90: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
8ea0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ec0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8ed0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
8ee0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
8ef0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
8f00: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
8f10: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
8f20: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
8f30: 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 70 50  ollback);.    pP
8f40: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
8f50: 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  lback = 0;.    s
8f60: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
8f70: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
8f80: 61 63 68 65 29 3b 0a 23 69 66 64 65 66 20 53 51  ache);.#ifdef SQ
8f90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8fa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
8fb0: 68 65 49 74 65 72 61 74 65 28 70 50 61 67 65 72  heIterate(pPager
8fc0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
8fd0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
8fe0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
8ff0: 65 33 50 63 61 63 68 65 43 6c 65 61 72 46 6c 61  e3PcacheClearFla
9000: 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
9010: 68 65 2c 0a 20 20 20 20 20 20 20 50 47 48 44 52  he,.       PGHDR
9020: 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 50 47  _IN_JOURNAL | PG
9030: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 0a 20 20  HDR_NEED_SYNC.  
9040: 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d    );.    pPager-
9050: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
9060: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
9070: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
9080: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9090: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
90a0: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
90b0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
90c0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
90d0: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
90e0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
90f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
9100: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9110: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
9120: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
9130: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
9140: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
9150: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
9160: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
9170: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
9180: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
9190: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
91a0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
91b0: 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75  nc = 0;.  /* lru
91c0: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
91d0: 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  ed(pPager); */. 
91e0: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
91f0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
9200: 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 50  e = -1;.  }.  pP
9210: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
9220: 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
9230: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
9240: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
9250: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
9260: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
9270: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
9280: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
9290: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
92a0: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
92b0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
92c0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
92d0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
92e0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
92f0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
9300: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
9310: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
9320: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
9330: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
9340: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
9350: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
9360: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
9370: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
9380: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
9390: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
93a0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
93b0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
93c0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
93d0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
93e0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
93f0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
9400: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
9410: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
9420: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
9430: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
9440: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
9450: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
9460: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
9470: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
9480: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
9490: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
94a0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
94b0: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
94c0: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
94d0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
94e0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
94f0: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
9500: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
9510: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
9520: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
9530: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
9540: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
9550: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
9560: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
9570: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
9580: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
9590: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
95a0: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
95b0: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
95c0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
95d0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
95e0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
95f0: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
9600: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
9610: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
9620: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
9630: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
9640: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
9650: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
9660: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
9670: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
9680: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
9690: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
96a0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
96b0: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
96c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
96d0: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
96e0: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
96f0: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
9700: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
9710: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
9720: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
9730: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
9740: 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
9750: 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a  n(PgHdr*);../*.*
9760: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
9770: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
9780: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
9790: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
97a0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
97b0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
97c0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
97d0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20  isMainJrnl flag 
97e0: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
97f0: 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  is the main roll
9800: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
9810: 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68  .** false for th
9820: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
9830: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72  nal.  The main r
9840: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
9850: 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  uses.** checksum
9860: 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
9870: 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
9880: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
9890: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
98a0: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
98b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
98c0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
98d0: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
98e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
98f0: 6c 65 20 2a 6a 66 64 2c 20 20 20 2f 2a 20 54 68  le *jfd,   /* Th
9900: 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 74  e file that is t
9910: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67  he journal being
9920: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
9930: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20    i64 offset,   
9940: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9950: 20 6f 66 20 74 68 65 20 70 61 67 65 20 77 69 74   of the page wit
9960: 68 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hin the journal 
9970: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
9980: 72 6e 6c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  rnl       /* Tru
9990: 65 20 66 6f 72 20 6d 61 69 6e 20 72 6f 6c 6c 62  e for main rollb
99a0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 46 61 6c  ack journal. Fal
99b0: 73 65 20 66 6f 72 20 53 74 6d 74 20 6a 72 6e 6c  se for Stmt jrnl
99c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
99d0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
9a00: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
9a10: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
9a40: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
9a50: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
9a60: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
9a90: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
9aa0: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
9ab0: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
9ac0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
9ad0: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
9ae0: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
9af0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
9b00: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
9b10: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
9b20: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
9b30: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
9b40: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
9b50: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
9b60: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
9b70: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
9b80: 66 64 20 3d 3d 20 28 69 73 4d 61 69 6e 4a 72 6e  fd == (isMainJrn
9b90: 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
9ba0: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
9bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  );.  assert( aDa
9bc0: 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  ta );..  rc = re
9bd0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
9be0: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
9bf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9c00: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
9c10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9c20: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
9c30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9c40: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
9c50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9c60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9c70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c80: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
9c90: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
9ca0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
9cb0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
9cc0: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
9cd0: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
9ce0: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
9cf0: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
9d00: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
9d10: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
9d20: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
9d30: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
9d40: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
9d50: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
9d60: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
9d70: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
9d80: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
9d90: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
9da0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
9db0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
9dc0: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
9dd0: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
9de0: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
9df0: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
9e00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9e10: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
9e20: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
9e30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
9e40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9e50: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
9e60: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
9e70: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9e80: 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50  s(jfd, offset+pP
9e90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
9ea0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9eb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9ec0: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9ed0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9ee0: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9ef0: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
9f00: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
9f10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f20: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
9f30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
9f40: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
9f50: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
9f60: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9f70: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
9f80: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9f90: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
9fa0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9fb0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9fc0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9fd0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9fe0: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9ff0: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
a000: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a010: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
a020: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
a030: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
a040: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
a050: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
a060: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
a070: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
a080: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
a090: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
a0a0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
a0b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
a0c0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
a0d0: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
a0e0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
a0f0: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
a100: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
a110: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
a120: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
a130: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
a140: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
a150: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
a160: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
a170: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
a180: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
a190: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
a1a0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
a1b0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
a1c0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
a1d0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
a1e0: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
a1f0: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
a200: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
a210: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
a220: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
a230: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
a240: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
a250: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
a260: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
a270: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
a280: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
a290: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
a2a0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
a2b0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
a2c0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
a2d0: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
a2e0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
a2f0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
a300: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
a310: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
a320: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
a330: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
a340: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
a350: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
a360: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
a370: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
a380: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
a390: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
a3a0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
a3b0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
a3c0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
a3d0: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
a3e0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
a3f0: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
a400: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
a410: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
a420: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
a430: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
a440: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
a450: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
a460: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
a470: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
a480: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
a490: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
a4a0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
a4b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
a4c0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
a4d0: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
a4e0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
a4f0: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
a500: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
a510: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a520: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
a530: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
a540: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
a550: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
a560: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
a570: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
a580: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
a590: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
a5a0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
a5b0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
a5c0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
a5d0: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
a5e0: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
a5f0: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
a600: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
a610: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
a620: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
a630: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
a640: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
a650: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
a660: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
a670: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
a680: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
a690: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
a6a0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
a6b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
a6c0: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
a6d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
a6e0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
a6f0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
a700: 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59  AGERTRACE4("PLAY
a710: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
a720: 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
a740: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
a750: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
a760: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
a770: 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20  Size, aData));. 
a780: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
a790: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a7a0: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
a7b0: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
a7c0: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
a7d0: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28 70  _SYNC)).   && (p
a7e0: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
a7f0: 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  ods).  ){.    i6
a800: 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
a810: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
a820: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
a830: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a840: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
a850: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
a860: 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 7d  Size, ofst);.  }
a870: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
a880: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
a890: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
a8a0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
a8b0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
a8c0: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
a8d0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
a8e0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
a8f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
a900: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
a910: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
a920: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
a930: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
a940: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
a950: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
a960: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
a970: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
a980: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
a990: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
a9a0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
a9b0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
a9c0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
a9d0: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
a9e0: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
a9f0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
aa00: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
aa10: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
aa20: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
aa30: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
aa40: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
aa50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
aa60: 73 4d 61 69 6e 4a 72 6e 6c 20 29 20 6d 61 6b 65  sMainJrnl ) make
aa70: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
aa80: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
aa90: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
aaa0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
aab0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
aac0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
aad0: 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
aae0: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
aaf0: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
ab00: 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
ab10: 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
ab20: 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
ab30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
ab40: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
ab50: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
ab60: 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
ab70: 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
ab80: 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
ab90: 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
aba0: 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
abb0: 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
abc0: 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
abd0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
abe0: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
abf0: 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 3);.    sqlite
ac00: 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
ac10: 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
ac20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
ac30: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
ac40: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
ac50: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ac60: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
ac70: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
ac80: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
ac90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
aca0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
acb0: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
acc0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
acd0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
ace0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
acf0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
ad00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
ad10: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
ad20: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
ad30: 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
ad40: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
ad50: 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
ad60: 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
ad70: 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
ad80: 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
ad90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
ada0: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  **.**.** The mas
adb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
adc0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
add0: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
ade0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
adf0: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
ae00: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
ae10: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
ae20: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
ae30: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
ae40: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
ae50: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
ae60: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
ae70: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
ae80: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
ae90: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
aea0: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
aeb0: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
aec0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
aed0: 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
aee0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
aef0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
af00: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
af10: 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
af20: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
af30: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
af40: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  0;.  sqlite3_fil
af50: 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71  e *pMaster;.  sq
af60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
af70: 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  rnal;.  char *zM
af80: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
af90: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
afa0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
afb0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
afc0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
afd0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
afe0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
aff0: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
b000: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b010: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
b020: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
b030: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
b040: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
b050: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
b060: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
b070: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
b080: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
b090: 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
b0a0: 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
b0b0: 65 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73  e3Malloc(pVfs->s
b0c0: 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
b0d0: 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
b0e0: 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
b0f0: 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
b100: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
b110: 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
b120: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b130: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
b140: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
b150: 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
b160: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
b170: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
b180: 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
b190: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
b1a0: 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
b1b0: 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
b1c0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
b1d0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
b1e0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
b1f0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a  ster_open = 1;..
b200: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b210: 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
b220: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
b230: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
b240: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
b250: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
b260: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
b270: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
b280: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
b290: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
b2a0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  r = 0;.    int n
b2b0: 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67  MasterPtr = pPag
b2c0: 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
b2d0: 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20  name+1;..    /* 
b2e0: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
b2f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b300: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
b310: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
b320: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
b330: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
b340: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
b350: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
b360: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
b370: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
b380: 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
b390: 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
b3a0: 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  erPtr);.    if( 
b3b0: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
b3c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
b3d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b3e0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
b3f0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
b400: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
b410: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
b420: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
b430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b440: 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
b450: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
b460: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
b470: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b480: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
b490: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
b4a0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
b4b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
b4c0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
b4d0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
b4e0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
b4f0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
b500: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
b510: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
b520: 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
b530: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
b540: 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
b550: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
b560: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b570: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
b580: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
b590: 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
b5a0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
b5b0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
b5c0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
b5d0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
b5e0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
b5f0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
b600: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
b610: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
b620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
b630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
b640: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
b650: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
b660: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
b670: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b680: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
b690: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
b6a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
b6b0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
b6c0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
b6d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b6e0: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
b6f0: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
b700: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
b710: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
b720: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b730: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
b740: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
b750: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
b760: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
b770: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
b780: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
b790: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
b7a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
b7b0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
b7c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b7d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
b7e0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
b7f0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
b800: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
b810: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
b820: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
b830: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
b840: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
b850: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
b860: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
b870: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
b880: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b890: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
b8a0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
b8b0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
b8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
b8d0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
b8e0: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
b8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
b900: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
b910: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
b920: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
b930: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
b940: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
b950: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b960: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
b970: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
b980: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
b990: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b9a0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
b9b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
b9c0: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
b9d0: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
b9e0: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
b9f0: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
ba00: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
ba10: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
ba20: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
ba30: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
ba40: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ba50: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
ba60: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
ba70: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
ba80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
ba90: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20  le..**.** Might 
baa0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
bab0: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
bac0: 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
bad0: 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a  er than nPage..*
bae0: 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  * This can happe
baf0: 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
bb00: 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65  if we are in the
bb10: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61   middle of a tra
bb20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  nsaction.** whic
bb30: 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74  h has extended t
bb40: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  he file size and
bb50: 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61   the new pages a
bb60: 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c  re still all hel
bb70: 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74  d.** in cache, t
bb80: 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  hen an INSERT or
bb90: 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73   UPDATE does a s
bba0: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
bbb0: 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72  k.  Some.** oper
bbc0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
bbd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
bbe0: 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
bbf0: 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74   you try to.** t
bc00: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
bc10: 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
bc20: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
bc30: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  it currently is,
bc40: 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68  .** so detect th
bc50: 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
bc60: 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
bc70: 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
bc80: 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69  of the new.** fi
bc90: 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73  le instead..*/.s
bca0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bcb0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
bcc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
bcd0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
bce0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
bcf0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
bd00: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
bd10: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
bd20: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
bd30: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
bd40: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
bd50: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
bd60: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
bd70: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
bd80: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
bd90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
bda0: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
bdb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
bdc0: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
bdd0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
bde0: 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
bdf0: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
be00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
be10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
be20: 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
be30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
be50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
be60: 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
be70: 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
be90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bea0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
beb0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
bec0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
bed0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
bee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
bf00: 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20   sectorSize for 
bf10: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
bf20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f  .**.** The secto
bf30: 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61  r size is at lea
bf40: 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65  st as big as the
bf50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
bf60: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
bf70: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
bf80: 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  ).  The minimum 
bf90: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35  sector size is 5
bfa0: 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
bfb0: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
bfc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bfd0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
bfe0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
bff0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c000: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
c010: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
c020: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
c030: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
c040: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c050: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
c060: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
c070: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
c080: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
c090: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
c0a0: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
c0b0: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
c0c0: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
c0d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c0e0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
c0f0: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
c100: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
c110: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c120: 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
c130: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c140: 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = 512;.  }.}../
c150: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
c160: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
c170: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
c180: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
c190: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
c1a0: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
c1b0: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
c1c0: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
c1d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c1e0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
c1f0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
c200: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
c210: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
c220: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
c230: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
c240: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c250: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c260: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
c270: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
c280: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
c290: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
c2a0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
c2b0: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
c2c0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
c2d0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
c2e0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
c2f0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
c300: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
c310: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
c320: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
c330: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
c340: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
c350: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
c360: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
c370: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c380: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
c390: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
c3a0: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
c3b0: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
c3c0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
c3d0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
c3e0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c3f0: 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
c400: 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
c410: 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
c420: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
c430: 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
c440: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
c450: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
c460: 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
c470: 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
c480: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
c490: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c4a0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
c4b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
c4c0: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
c4d0: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
c4e0: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
c4f0: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
c500: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
c510: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
c520: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
c530: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c540: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
c550: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
c560: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
c570: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
c580: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
c590: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
c5a0: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
c5b0: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
c5c0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
c5d0: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
c5e0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c5f0: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
c600: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
c610: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
c620: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
c630: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
c640: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
c650: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
c660: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
c670: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
c680: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
c690: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c6a0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
c6b0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
c6c0: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
c6d0: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
c6e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c6f0: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
c700: 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
c710: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
c720: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
c730: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
c740: 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
c750: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
c760: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
c770: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
c780: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
c790: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c7a0: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
c7b0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
c7c0: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
c7d0: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
c7e0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
c7f0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
c800: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
c820: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
c830: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
c840: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
c850: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
c860: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
c870: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
c880: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
c890: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c8a0: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
c8b0: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
c8c0: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
c8d0: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
c8e0: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
c8f0: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
c900: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
c910: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
c920: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
c930: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
c940: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
c950: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
c960: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
c970: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
c980: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
c990: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
c9a0: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
c9b0: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
c9c0: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
c9d0: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
c9e0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
c9f0: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
ca00: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
ca10: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
ca20: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
ca30: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
ca40: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
ca50: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
ca60: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
ca70: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
ca80: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
ca90: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
caa0: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
cab0: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
cac0: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
cad0: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
cae0: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
caf0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
cb00: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
cb10: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
cb20: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
cb30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
cb40: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
cb50: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
cb60: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
cb70: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
cb80: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
cb90: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
cba0: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
cbb0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
cbc0: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
cbd0: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
cbe0: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
cbf0: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
cc00: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
cc10: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
cc20: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
cc30: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
cc40: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
cc50: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
cc60: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
cc70: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
cc80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
cc90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
cca0: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
ccb0: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
ccc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
ccd0: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
cce0: 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
ccf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
cd10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
cd20: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
cd30: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
cd40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd50: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
cd60: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
cd70: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
cd80: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cd90: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
cda0: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
cdb0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
cdc0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
cdd0: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
cde0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
ce10: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
ce20: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
ce30: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
ce40: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
ce50: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
ce60: 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
ce70: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
ce80: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
ce90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cea0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
ceb0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
cec0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
ced0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
cee0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
cef0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
cf00: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
cf10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
cf20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
cf30: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
cf40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
cf50: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
cf60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cf70: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
cf80: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
cf90: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
cfa0: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
cfb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cfc0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
cfd0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
cfe0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
cff0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d000: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
d010: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
d020: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
d030: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
d040: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
d050: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
d060: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
d070: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
d080: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ack..  */.  zMas
d090: 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
d0a0: 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
d0b0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d0c0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
d0d0: 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
d0e0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
d0f0: 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
d100: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
d110: 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
d120: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
d130: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
d140: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
d150: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
d160: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
d170: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d180: 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
d190: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
d1a0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
d1b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d1c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
d1d0: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
d1e0: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
d1f0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
d200: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
d210: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
d220: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
d230: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
d240: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
d250: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
d260: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
d270: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d280: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
d290: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
d2a0: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
d2b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
d2c0: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
d2d0: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
d2e0: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
d2f0: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
d300: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
d310: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
d320: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
d330: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
d340: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
d350: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d360: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
d370: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
d380: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
d390: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
d3a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d3b0: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
d3c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
d3d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d3e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d3f0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
d400: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
d410: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
d420: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
d430: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
d440: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
d450: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
d460: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
d470: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
d480: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
d490: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
d4a0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
d4b0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
d4c0: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
d4d0: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
d4e0: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
d4f0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
d500: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
d510: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
d520: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d530: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
d540: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d550: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d560: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
d570: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d580: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
d590: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
d5a0: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
d5b0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
d5c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d5d0: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
d5e0: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
d5f0: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
d600: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
d610: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
d620: 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
d630: 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
d640: 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
d650: 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
d660: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
d670: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
d680: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
d690: 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
d6a0: 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
d6b0: 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
d6c0: 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
d6d0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
d6e0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
d6f0: 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
d700: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
d710: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
d720: 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
d730: 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
d740: 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
d750: 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20   #2565..    */. 
d760: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
d770: 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
d780: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
d790: 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
d7a0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
d7b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d7c0: 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
d7d0: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d7e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
d7f0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
d800: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
d810: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
d820: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
d830: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
d840: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
d850: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
d860: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
d870: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
d880: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
d890: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d8a0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
d8b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
d8c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
d8d0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
d8e0: 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
d8f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d900: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
d910: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d920: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
d930: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
d940: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
d950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
d960: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
d970: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
d980: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
d990: 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
d9a0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
d9b0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d9c0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d9d0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
d9e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
d9f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
da00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
da10: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
da20: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
da30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
da40: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
da50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
da60: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
da70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
da80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
da90: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
daa0: 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
dab0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  k, then the data
dac0: 62 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79  base is probably
dad0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f  .          ** go
dae0: 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65  ing to end up be
daf0: 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74  ing corrupt.  It
db00: 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75   is corrupt to u
db10: 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20  s, anyhow..     
db20: 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20       ** Perhaps 
db30: 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73  the next process
db40: 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63   to come along c
db50: 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20  an fix it.....  
db60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
db70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
db80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
db90: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dba0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
dbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dbc0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
dbd0: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
dbe0: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
dbf0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
dc00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dc10: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
dc20: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
dc30: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
dc40: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
dc50: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
dc60: 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
dc70: 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d  Pathname+1);.  }
dc80: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
dc90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
dca0: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
dcb0: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
dcc0: 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
dcd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
dce0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
dcf0: 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
dd00: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
dd10: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
dd20: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
dd30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
dd40: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
dd50: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
dd60: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
dd70: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
dd80: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
dd90: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
dda0: 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
ddb0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
ddc0: 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
ddd0: 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
dde0: 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
ddf0: 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
de00: 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
de10: 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
de20: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
de30: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
de40: 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
de50: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
de60: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
de70: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
de80: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
de90: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
dea0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
deb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
dec0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
ded0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
dee0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
def0: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
df00: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
df10: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
df20: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
df30: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
df40: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
df50: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
df60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
df70: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
df80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
df90: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
dfa0: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
dfb0: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
dfc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
dfd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
dfe0: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
dff0: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
e000: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
e010: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
e020: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
e030: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
e040: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
e050: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
e060: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
e070: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
e080: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
e090: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
e0a0: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
e0b0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
e0c0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
e0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e0e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
e0f0: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
e100: 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
e110: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
e120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e130: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
e140: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e160: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
e170: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
e180: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e190: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74  alOff;..  /* Set
e1a0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
e1b0: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
e1c0: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
e1d0: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
e1e0: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
e1f0: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
e200: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
e210: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
e220: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
e230: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
e240: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
e250: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
e260: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
e270: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
e280: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
e290: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
e2a0: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
e2b0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
e2c0: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
e2d0: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
e2e0: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
e2f0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
e300: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
e310: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
e320: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
e330: 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
e340: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e350: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
e360: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
e370: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e380: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
e390: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
e3a0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
e3b0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
e3c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
e3d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e3e0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
e3f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e400: 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d  Open );.  nRec =
e410: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
e420: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
e430: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
e440: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
e450: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e460: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
e470: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e480: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
e490: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e4a0: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
e4b0: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
e4c0: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
e4d0: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
e4e0: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
e4f0: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
e500: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
e510: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
e520: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
e530: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e540: 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  = i*(4+pPager->p
e550: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
e560: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
e570: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
e580: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
e590: 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20   offset, 0);.   
e5a0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e5b0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e5c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e5d0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e5e0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e5f0: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
e600: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
e610: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
e620: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
e630: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
e640: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
e650: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e660: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
e670: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
e680: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
e690: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
e6a0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
e6b0: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
e6c0: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
e6d0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
e6e0: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
e6f0: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
e700: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
e710: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
e720: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
e730: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e740: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
e750: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
e760: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
e770: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
e780: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
e790: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
e7a0: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
e7b0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
e7c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e7d0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
e7e0: 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
e7f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e800: 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
e810: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
e820: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
e830: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
e840: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
e850: 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
e860: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e870: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e880: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e890: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e8a0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e8b0: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
e8c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
e8d0: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
e8e0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
e8f0: 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
e900: 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
e910: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
e920: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
e930: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
e940: 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
e950: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e960: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e970: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e980: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e990: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
e9a0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
e9b0: 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
e9c0: 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
e9d0: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
e9e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
e9f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ea00: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
ea10: 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
ea20: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
ea30: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
ea40: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
ea50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
ea60: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
ea70: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
ea80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ea90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
eaa0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
eab0: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
eac0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ead0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
eae0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
eaf0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
eb00: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
eb10: 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
eb20: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
eb30: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
eb40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eb50: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
eb60: 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
eb70: 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
eb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
eb90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
eba0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
ebb0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
ebc0: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
ebd0: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
ebe0: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
ebf0: 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
ec00: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
ec10: 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
ec20: 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
ec30: 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
ec40: 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
ec50: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
ec60: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
ec70: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
ec80: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
ec90: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
eca0: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
ecb0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
ecc0: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
ecd0: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
ece0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ecf0: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
ed00: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
ed10: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
ed20: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
ed30: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
ed40: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
ed50: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
ed60: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
ed70: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
ed80: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
ed90: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
eda0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
edb0: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
edc0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
edd0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
ede0: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
edf0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
ee00: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
ee10: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
ee20: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
ee30: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
ee40: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
ee50: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
ee70: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
ee80: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
ee90: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
eea0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
eeb0: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
eec0: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
eed0: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
eee0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
eef0: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
ef00: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
ef10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
ef20: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
ef30: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
ef40: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
ef50: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
ef70: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
ef80: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
ef90: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
efa0: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
efb0: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
efc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
efd0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
efe0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
eff0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f000: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
f010: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
f020: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
f030: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
f040: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
f050: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
f060: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
f080: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
f090: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
f0a0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
f0b0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
f0c0: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
f0d0: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
f0e0: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
f0f0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
f100: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
f110: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
f120: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
f130: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
f140: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
f150: 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
f160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f170: 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
f180: 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
f190: 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
f1a0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
f1b0: 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
f1c0: 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
f1d0: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
f1e0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
f1f0: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
f200: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
f210: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
f220: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
f230: 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
f240: 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
f250: 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
f260: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
f270: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f280: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
f290: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
f2a0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f2b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
f2c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
f2d0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
f2e0: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
f2f0: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
f300: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
f310: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
f320: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
f330: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
f340: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f350: 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
f360: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
f370: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
f380: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
f390: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
f3a0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
f3b0: 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
f3c0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f3d0: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
f3e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f3f0: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
f400: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
f410: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
f420: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
f430: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
f440: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  e the temporary.
f450: 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ** file when it 
f460: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
f470: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
f480: 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
f490: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f4a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
f4b0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f4c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
f4d0: 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
f4e0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f4f0: 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
f500: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
f510: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
f520: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
f530: 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
f540: 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
f550: 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
f560: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
f570: 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
f580: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
f590: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
f5a0: 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
f5b0: 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
f5c0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
f5d0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
f5e0: 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
f5f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
f600: 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
f610: 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
f620: 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
f630: 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
f640: 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
f650: 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
f660: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f670: 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  TE_OK || pFile->
f680: 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65  pMethods );.  re
f690: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
f6a0: 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
f6b0: 73 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20  ss(void *,PgHdr 
f6c0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  *);../*.** Creat
f6d0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
f6e0: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
f6f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
f700: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
f710: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
f720: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
f730: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
f740: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
f750: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
f760: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
f770: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
f780: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
f790: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
f7a0: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
f7b0: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
f7c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
f7d0: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
f7e0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
f7f0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
f800: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
f810: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
f820: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
f830: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
f840: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
f850: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
f860: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
f870: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
f880: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
f890: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
f8a0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
f8b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
f8c0: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
f8d0: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
f8e0: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
f8f0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
f900: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
f910: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
f920: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
f930: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
f940: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
f950: 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
f960: 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
f970: 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
f980: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
f990: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
f9a0: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
f9b0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
f9c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f9d0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
f9e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
f9f0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
fa00: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa20: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
fa30: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
fa40: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
fa50: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
fa60: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
fa70: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
fa80: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
fa90: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
faa0: 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
fab0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
fac0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
fad0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  en() */.){.  u8 
fae0: 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
faf0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  pPager = 0;.  in
fb00: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fb10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
fb20: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
fb30: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
fb40: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
fb50: 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
fb60: 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
fb70: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
fb80: 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
fb90: 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
fba0: 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
fbb0: 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74  DLOCK)!=0;.  int
fbc0: 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
fbd0: 3b 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  ;.  int pcacheSi
fbe0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
fbf0: 68 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20  heSize();.  int 
fc00: 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
fc10: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
fc20: 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
fc30: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
fc40: 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
fc50: 30 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0;..  if( sqlite
fc60: 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
fc70: 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
fc80: 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
fc90: 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
fca0: 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
fcb0: 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
fcc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
fcd0: 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
fce0: 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
fcf0: 7a 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ze();.  }..  /* 
fd00: 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
fd10: 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
fd20: 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
fd30: 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
fd40: 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
fd50: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
fd60: 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
fd70: 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
fd80: 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
fd90: 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
fda0: 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
fdb0: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
fdc0: 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
fdd0: 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
fde0: 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
fdf0: 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
fe00: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
fe10: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
fe20: 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   ){.    nPathnam
fe30: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
fe40: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
fe50: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
fe60: 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a  alloc(nPathname*
fe70: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
fe80: 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
fe90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fea0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66  NOMEM;.    }.#if
feb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fec0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
fed0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
fee0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
fef0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
ff00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
ff10: 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
ff20: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ff30: 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
ff40: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
ff50: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
ff60: 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
ff70: 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
ff80: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
ff90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ffa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ffb0: 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
ffc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ffd0: 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65   }.    nPathname
ffe0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e   = strlen(zPathn
fff0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
10000 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
10010 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74  for the pager st
10020 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61  ructure */.  pPa
10030 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ger = sqlite3Mal
10040 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a  locZero(.    siz
10050 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20  eof(*pPager) +  
10060 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
10070 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
10080 20 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20     pcacheSize   
10090 20 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f     +           /
100a0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
100b0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
100c0 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20  leSize +        
100d0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
100e0 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  l file structure
100f0 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73   */ .    pVfs->s
10100 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20  zOsFile  +      
10110 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
10120 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
10130 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
10140 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  * 2 +       /* T
10150 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
10160 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e  iles */ .    3*n
10170 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20  Pathname + 40   
10180 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
10190 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72  ename, zDirector
101a0 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  y, zJournal */. 
101b0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
101c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
101d0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
101e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
101f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
10200 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
10210 20 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70 50   = (PCache *)&pP
10220 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20  ager[1];.  pPtr 
10230 3d 20 28 28 75 38 20 2a 29 26 70 50 61 67 65 72  = ((u8 *)&pPager
10240 5b 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a  [1]) + pcacheSiz
10250 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  e;.  pPager->vfs
10260 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
10270 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
10280 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10290 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
102a0 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65  File*0];.  pPage
102b0 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74  r->stfd = (sqlit
102c0 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
102d0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a  Vfs->szOsFile];.
102e0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
102f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
10300 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
10310 69 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  ile+journalFileS
10320 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
10330 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
10340 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  r*)&pPtr[pVfs->s
10350 7a 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e 61  zOsFile+2*journa
10360 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
10370 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10380 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
10390 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
103a0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
103b0 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
103c0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61  ->zDirectory[nPa
103d0 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
103e0 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
103f0 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  ;.  if( zPathnam
10400 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e ){.    memcpy(
10410 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
10420 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
10430 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
10440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
10450 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  thname);.  }..  
10460 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
10470 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
10480 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
10490 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
104a0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66  !memDb ){.    if
104b0 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66  ( nPathname>(pVf
104c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20  s->mxPathname - 
104d0 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
104e0 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ")) ){.      rc 
104f0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
10500 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
10510 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
10520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10530 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10540 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
10550 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a  me, pPager->fd,.
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
10580 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74  >vfsFlags, &fout
10590 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c  );.      readOnl
105a0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
105b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
105c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
105d0 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
105e0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
105f0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
10600 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63  cess,.      ** c
10610 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
10620 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
10630 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
10640 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ate the.      **
10650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10660 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
10670 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
10680 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a  imum of:.      *
10690 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  *.      **    + 
106a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
106b0 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  AGE_SIZE,.      
106c0 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
106d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
106e0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
106f0 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  e().      **    
10700 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
10710 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
10720 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
10730 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  ically..      */
10740 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
10750 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
10760 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
10770 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65   int iSectorSize
10780 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
10790 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
107a0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
107b0 73 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74  szPageDflt<iSect
107c0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
107d0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
107e0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
107f0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
10800 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
10810 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
10820 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
10830 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
10840 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
10850 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
10860 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  d);.          in
10870 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
10880 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
10890 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
108a0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
108b0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
108c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
108d0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
108e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
108f0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
10900 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
10910 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
10920 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
10930 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
10940 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
10950 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
10960 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
10970 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
10980 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
10990 29 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  ) ) szPageDflt =
109a0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
109b0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
109c0 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  f.        if( sz
109d0 50 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f  PageDflt>SQLITE_
109e0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
109f0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
10a00 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
10a10 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
10a20 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
10a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10a40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
10a50 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
10a60 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
10a70 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
10a80 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
10a90 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
10aa0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
10ab0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
10ac0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
10ad0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
10ae0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
10af0 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
10b00 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
10b10 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
10b20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
10b30 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
10b40 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
10b50 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
10b60 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
10b70 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
10b80 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
10b90 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
10ba0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
10bb0 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
10bc0 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
10bd0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
10be0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
10bf0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
10c00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10c10 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
10c20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
10c30 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
10c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
10c50 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  r->pTmpSpace = s
10c60 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
10c70 28 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20  (szPageDflt);.  
10c80 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
10c90 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
10ca0 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
10cb0 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20  cks above..  ** 
10cc0 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  Free the Pager s
10cd0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
10ce0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
10cf0 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  * Since the page
10d00 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
10d10 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
10d20 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
10d30 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
10d40 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
10d50 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
10d60 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d   || !pPager->pTm
10d70 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pSpace ){.    sq
10d80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
10d90 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
10da0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
10db0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
10dc0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
10dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
10de0 3b 0a 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d  ;.  }.  nExtra =
10df0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
10e00 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
10e10 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
10e20 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
10e30 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
10e50 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
10e60 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
10e70 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
10e80 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
10e90 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
10ea0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
10eb0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
10ec0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10ed0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
10ee0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
10ef0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
10f00 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20  ilename))..  /* 
10f10 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44  Fill in Pager.zD
10f20 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20  irectory[] */.  
10f30 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
10f40 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65  Directory, pPage
10f50 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
10f60 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f  athname+1);.  fo
10f70 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65  r(i=strlen(pPage
10f80 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20  r->zDirectory); 
10f90 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
10fa0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
10fb0 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
10fc0 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
10fd0 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
10fe0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  = 0;..  /* Fill 
10ff0 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  in Pager.zJourna
11000 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  l[] */.  if( zPa
11010 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65  thname ){.    me
11020 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
11030 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  urnal, pPager->z
11040 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
11050 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
11060 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
11070 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
11080 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
11090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
110a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30  er->zJournal = 0
110b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67  ;.  }..  /* pPag
110c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
110d0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
110e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
110f0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
11100 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
11110 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20  = noReadlock && 
11120 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
11130 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
11140 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
11150 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
11160 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11170 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
11180 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
11190 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
111a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
111b0 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20  = szPageDflt;.  
111c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
111d0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
111e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
111f0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
11200 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
11210 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
11220 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
11230 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
11240 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
11250 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
11260 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
11270 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
11280 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11290 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
112a0 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
112b0 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
112c0 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
112d0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
112e0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
112f0 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
11300 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
11310 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
11320 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
11330 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
11340 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
11350 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
11360 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
11370 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
11380 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
11390 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
113a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
113b0 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
113c0 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
113d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
113e0 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
113f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
11400 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
11410 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
11420 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
11430 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
11440 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
11450 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
11460 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
11470 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
11480 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
11490 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
114a0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
114b0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
114c0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
114d0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
114e0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
114f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
11500 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
11510 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
11520 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
11530 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
11540 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
11550 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
11560 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d 70  ->pMethods||temp
11570 46 69 6c 65 29 3b 0a 20 20 73 65 74 53 65 63 74  File);.  setSect
11580 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
11590 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20    if( memDb ){. 
115a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
115b0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
115c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
115d0 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
115e0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
115f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
11600 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
11610 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
11620 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
11630 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
11640 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
11650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11660 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
11670 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
11680 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
11690 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
116a0 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
116b0 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
116c0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
116d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
116e0 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
116f0 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
11700 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
11710 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
11720 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
11730 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
11740 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
11750 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
11760 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
11770 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
11780 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
11790 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
117a0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
117b0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
117c0 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
117d0 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
117e0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
117f0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
11800 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
11810 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
11820 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
11830 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
11840 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
11850 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
11860 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
11870 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
11880 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
11890 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
118a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
118b0 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
118c0 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
118d0 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
118e0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
118f0 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
11900 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
11910 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
11920 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
11930 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11940 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11950 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
11960 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
11970 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
11980 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
11990 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
119a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
119b0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
119c0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
119d0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
119e0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
119f0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11a00 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
11a10 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11a20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   );.    if( page
11a30 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
11a40 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
11a50 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61  ze .     && (pPa
11a60 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
11a70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
11a80 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
11a90 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
11aa0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
11ab0 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)==0 .    ){.  
11ac0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
11ad0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
11ae0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
11af0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
11b00 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
11b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11b20 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
11b30 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
11b40 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
11b50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
11b60 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
11b70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e;.        if( !
11b80 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
11b90 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
11ba0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
11bb0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
11bc0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
11bd0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
11be0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
11bf0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
11c00 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
11c10 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
11c20 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
11c30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c40 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
11c50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11c60 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
11c70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11c80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
11c90 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
11ca0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
11cb0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
11cc0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
11cd0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
11ce0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
11cf0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
11d00 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
11d10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
11d20 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
11d30 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
11d40 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
11d50 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
11d60 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11d70 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
11d80 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
11d90 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
11da0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
11db0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
11dc0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
11dd0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
11de0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
11df0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
11e00 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
11e10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
11e20 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
11e30 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
11e40 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
11e50 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
11e60 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
11e70 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
11e80 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
11e90 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
11ea0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
11eb0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
11ec0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
11ed0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
11ee0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
11ef0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11f00 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
11f10 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
11f20 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
11f30 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
11f40 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11f50 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
11f60 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
11f70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
11f80 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
11f90 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
11fa0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
11fb0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
11fc0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11fd0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
11fe0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
11ff0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
12000 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
12010 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
12020 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
12030 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
12040 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
12050 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
12060 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
12070 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
12080 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
12090 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
120a0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
120b0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
120c0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
120d0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
120e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
120f0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
12100 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
12110 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
12120 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
12130 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
12140 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
12150 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
12160 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
12170 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
12180 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
12190 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
121a0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
121b0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
121c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
121d0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
121e0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
121f0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
12200 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12210 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
12220 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
12230 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
12240 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
12250 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
12260 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12270 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
12280 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
12290 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
122a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
122b0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
122c0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
122d0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
122e0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
122f0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
12300 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
12310 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
12320 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
12330 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
12340 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
12350 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
12360 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
12370 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
12380 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
12390 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
123a0 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
123b0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
123c0 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
123d0 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
123e0 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
123f0 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
12400 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
12410 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
12420 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
12430 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
12440 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
12450 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
12460 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
12470 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
12480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12490 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
124a0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
124b0 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
124c0 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
124d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
124e0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
124f0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
12500 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
12510 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
12520 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12530 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
12540 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
12550 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
12560 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
12570 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
12580 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
12590 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
125a0 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
125b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
125c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
125d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
125e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
125f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12600 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12610 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
12620 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
12630 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
12640 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
12650 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
12660 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
12670 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
12680 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
12690 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
126a0 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
126b0 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
126c0 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
126d0 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
126e0 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
126f0 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
12700 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
12710 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
12720 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
12730 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
12740 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
12750 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
12760 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
12770 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12780 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12790 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
127a0 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
127b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
127c0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
127d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
127e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
127f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
12800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12810 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
12820 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
12830 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
12840 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
12850 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
12860 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
12870 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12880 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
12890 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
128a0 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
128b0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
128c0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
128d0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
128e0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
128f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
12900 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12920 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
12930 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12940 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
12950 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
12960 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
12970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12980 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
12990 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
129a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
129b0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
129c0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
129d0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
129e0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
129f0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
12a00 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
12a10 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12a20 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
12a30 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
12a40 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
12a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12a70 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
12a80 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
12a90 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12aa0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
12ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12ac0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
12ad0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
12ae0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
12af0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
12b00 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
12b10 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
12b20 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
12b30 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
12b40 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
12b50 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
12b60 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
12b70 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
12b80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12b90 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
12ba0 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
12bb0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
12bc0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
12bd0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
12be0 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
12bf0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
12c00 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
12c10 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
12c20 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
12c30 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
12c40 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
12c50 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
12c60 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
12c70 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
12c80 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
12c90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12ca0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12cb0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12cc0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
12cd0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
12ce0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
12cf0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
12d00 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
12d10 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
12d20 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
12d30 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
12d40 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
12d50 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
12d60 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
12d70 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
12d80 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
12d90 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
12da0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
12db0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
12dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12dd0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
12de0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
12df0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
12e00 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
12e10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12e20 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
12e30 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12e40 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
12e50 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
12e60 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
12e70 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
12e80 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
12e90 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
12ea0 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
12eb0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
12ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
12ed0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
12ee0 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
12ef0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
12f00 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
12f10 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
12f20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
12f30 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
12f40 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
12f50 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
12f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
12f70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12f80 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
12f90 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 3b 0a  er->dbSize<0 );.
12fa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12fb0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
12fc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12fd0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
12fe0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
12ff0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50  BusyHandler ) pP
13000 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13010 65 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  er->nBusy = 0;. 
13020 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
13030 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
13040 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
13050 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
13060 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
13070 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
13080 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
13090 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
130a0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
130b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
130c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
130d0 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
130e0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
130f0 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
13100 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
13110 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
13120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13130 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
13140 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
13150 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
13160 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
13170 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
13180 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
13190 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
131a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
131b0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
131c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
131d0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
131e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
131f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
13200 30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  0);.  if( pPager
13210 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
13220 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
13230 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 20 69  rCode;.  }else i
13240 66 28 20 6e 50 61 67 65 3c 28 75 6e 73 69 67 6e  f( nPage<(unsign
13250 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
13260 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79  e ){.    rc = sy
13270 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
13280 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
132a0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
132b0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
132c0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
132d0 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
132e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
132f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13300 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
13310 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
13320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13330 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13340 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
13350 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
13360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13380 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
13390 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
133a0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
133b0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
133c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
133d0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
133e0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
133f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13400 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
13410 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
13420 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
13430 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
13440 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
13450 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
13460 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
13470 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
13480 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
13490 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
134a0 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
134b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
134c0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
134d0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
134e0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
134f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13500 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
13510 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
13520 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
13530 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
13540 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
13550 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
13560 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
13570 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
13580 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
13590 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
135a0 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
135b0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
135c0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
135d0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
135e0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
135f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
13600 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
13610 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
13620 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
13630 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13640 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13650 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13660 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
13670 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
13680 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
13690 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61  !MEMDB ){.    pa
136a0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
136b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
136c0 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  }.  enable_simul
136d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
136e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
136f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
13700 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
13710 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
13720 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
13730 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
13740 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
13750 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13760 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
13770 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13780 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
13790 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
137a0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
137b0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71  InJournal);.  sq
137c0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
137d0 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  oy(pPager->pAlwa
137e0 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 69  ysRollback);.  i
137f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
13800 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
13810 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13820 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
13830 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13840 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
13850 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
13860 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
13870 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
13880 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
13890 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
138a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
138b0 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
138c0 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
138d0 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  */..  sqlite3Pag
138e0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
138f0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
13900 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
13910 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
13920 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13930 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
13940 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13950 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
13960 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
13970 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
13980 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
13990 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
139a0 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
139b0 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
139c0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
139d0 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
139e0 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
139f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13a00 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
13a10 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
13a20 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
13a30 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
13a40 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
13a50 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
13a60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
13a70 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
13a80 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
13a90 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20  cacheRef(pPg);. 
13aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ab0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
13ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13ad0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
13ae0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
13af0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
13b00 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
13b10 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
13b20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
13b30 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
13b40 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
13b50 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
13b60 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
13b70 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13b80 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
13b90 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
13ba0 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
13bb0 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
13bc0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
13bd0 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
13be0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
13bf0 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
13c00 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
13c10 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
13c20 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
13c30 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
13c40 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
13c50 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
13c60 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
13c70 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
13c80 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
13c90 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
13ca0 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
13cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
13cc0 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
13cd0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
13ce0 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
13cf0 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
13d00 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
13d10 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
13d20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
13d30 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13d40 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
13d50 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
13d60 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
13d70 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
13d80 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
13d90 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
13da0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
13db0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
13dc0 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
13dd0 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
13de0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
13df0 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
13e00 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
13e10 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
13e20 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
13e30 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
13e40 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  no sync occurs..
13e50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43  **.** If the IOC
13e60 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c  AP_SEQUENTIAL fl
13e70 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74 68  ag is set for th
13e80 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
13e90 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74  ia on which.** t
13ea0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
13eb0 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79  tored, then OsSy
13ec0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
13ed0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  lled on the jour
13ee0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20  nal.** file. In 
13ef0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68  this case all th
13f00 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
13f10 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
13f20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a  nRec field in.**
13f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
13f40 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  der..**.** This 
13f50 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
13f60 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
13f70 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
13f80 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
13f90 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
13fa0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
13fb0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13fc0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
13fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
13fe0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
13ff0 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
14000 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
14010 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
14020 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
14030 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
14040 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
14050 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
14060 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
14070 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14080 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
14090 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
140a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
140b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
140c0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
140d0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
140e0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
140f0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
14100 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
14110 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14120 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
14130 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
14140 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
14150 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
14160 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
14170 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
14180 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
14190 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
141a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
141b0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
141c0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
141d0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
141e0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
141f0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
14200 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
14210 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
14220 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
14230 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
14240 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
14250 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
14260 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
14270 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
14280 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
14290 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
142a0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
142b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
142c0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
142d0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
142e0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
142f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
14300 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
14310 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
14320 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
14330 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
14340 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
14350 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
14360 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
14370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
14380 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
14390 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
143a0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
143b0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
143c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
143d0 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20  jrnlOff;.       
143e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
143f0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
14400 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
14410 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
14420 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
14430 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
14440 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
14450 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
14460 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
14470 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
14480 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
14490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
144a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
144b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
144c0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
144d0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
144e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
144f0 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66  ..        jrnlOf
14500 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
14510 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
14520 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
14530 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
14540 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
14550 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72  d\n", pPager, jr
14560 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20  nlOff, 4));.    
14570 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
14580 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
14590 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65  , jrnlOff, pPage
145a0 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
145b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
145c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
145d0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
145e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
145f0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
14600 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
14610 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
14620 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
14630 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
14640 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
14650 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
14660 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
14670 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
14680 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
14690 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20  ->sync_flags| . 
146a0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
146b0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
146c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
146d0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
146e0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
146f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14700 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
14710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
14730 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
14740 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
14750 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
14760 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
14770 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
14780 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
14790 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  */.    sqlite3Pc
147a0 61 63 68 65 43 6c 65 61 72 46 6c 61 67 73 28 70  acheClearFlags(p
147b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
147c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
147d0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
147e0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
147f0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
14800 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
14810 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
14820 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
14830 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
14840 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
14850 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
14860 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
14870 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
14880 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  /.  else{.    sq
14890 6c 69 74 65 33 50 63 61 63 68 65 41 73 73 65 72  lite3PcacheAsser
148a0 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  tFlags(pPager->p
148b0 50 43 61 63 68 65 2c 20 30 2c 20 50 47 48 44 52  PCache, 0, PGHDR
148c0 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d  _NEED_SYNC);.  }
148d0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
148e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
148f0 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
14900 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
14910 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
14920 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
14930 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
14940 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
14950 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
14960 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c  se file. No call
14970 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f  s are made.** to
14980 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
14990 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
149a0 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20 69  s as clean. It i
149b0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
149c0 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63  lity.** of the c
149d0 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63 61  aller to use Pca
149e0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72  cheCleanAll() or
149f0 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e   PcacheMakeClean
14a00 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68  () to mark.** th
14a10 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e  e pages as clean
14a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14a30 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14a40 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
14a50 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
14a60 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
14a70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14a80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14a90 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
14aa0 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
14ab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14ac0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
14ad0 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
14ae0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
14af0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
14b00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
14b10 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
14b20 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14b30 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
14b40 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
14b50 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
14b60 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
14b70 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
14b80 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
14b90 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
14ba0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
14bb0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
14bc0 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
14bd0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
14be0 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
14bf0 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
14c00 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
14c10 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
14c20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
14c30 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
14c40 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
14c50 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
14c60 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
14c70 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
14c80 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
14c90 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
14ca0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
14cb0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
14cc0 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
14cd0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
14ce0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
14cf0 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
14d00 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
14d10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
14d20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
14d30 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
14d40 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
14d50 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
14d60 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
14d70 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
14d80 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
14d90 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
14da0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
14db0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
14dc0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
14dd0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
14de0 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
14df0 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
14e00 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
14e10 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
14e20 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
14e30 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
14e40 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
14e50 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
14e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14e70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
14e80 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
14e90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
14ea0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
14eb0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
14ec0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
14ed0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
14ee0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
14ef0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
14f00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
14f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14f20 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
14f30 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
14f40 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
14f50 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
14f60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14f70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14f80 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
14f90 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
14fa0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
14fb0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
14fc0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
14fd0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
14fe0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
14ff0 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
15000 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
15010 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
15020 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
15030 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
15040 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
15050 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
15060 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
15070 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
15080 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
15090 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
150a0 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
150b0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
150c0 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
150d0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
150e0 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
150f0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15100 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
15110 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
15120 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
15130 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73 74  st->pData, pList
15140 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
15150 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
15160 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
15170 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15190 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
151a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
151b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
151c0 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
151d0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
151e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
151f0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
15200 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15210 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
15220 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
15230 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
15240 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47  fset);.      PAG
15250 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
15260 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
15270 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
15280 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
15290 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66  Write);.      if
152a0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
152b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
152c0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
152d0 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
152e0 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
152f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
15300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15310 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
15320 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41    else{.      PA
15330 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f  GERTRACE3("NOSTO
15340 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
15350 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
15360 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
15370 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15380 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15390 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  n rc;.#ifdef SQL
153a0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
153b0 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
153c0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
153d0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
153e0 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
153f0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
15400 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
15410 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15420 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15430 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
15440 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
15450 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
15460 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
15470 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
15480 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
15490 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67 65  inter to a purge
154a0 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20 6f  able Pager .** o
154b0 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e 63  bject. This func
154c0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
154d0 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20 64   make a single d
154e0 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20 68  irty page that h
154f0 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e  as no.** outstan
15500 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15510 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 20  (if one exists) 
15520 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69 74  clean so that it
15530 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
15540 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61 63   .** by the pcac
15550 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  he layer..*/.sta
15560 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
15570 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
15580 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
15590 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
155a0 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
155b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
155c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
155d0 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 65  otSync ){.    re
155e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
155f0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
15600 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
15610 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20 70  DIRTY );.  if( p
15620 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
15630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15640 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
15650 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
15660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
15670 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
15680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15690 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
156a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
156b0 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
156c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
156d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
156e0 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
156f0 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
15700 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
15710 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
15720 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
15730 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
15740 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
15750 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
15760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
15770 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
15780 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
15790 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
157a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157b0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
157c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
157d0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
157e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
157f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15810 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15820 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
15830 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
15840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
15850 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
15860 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
15870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15880 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
15890 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
158a0 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
158b0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
158c0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
158d0 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
158e0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
158f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15900 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
15910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15920 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
15930 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
15940 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
15950 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
15960 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
15970 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
15980 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
15990 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
159a0 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
159b0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  urnal..**.** Ret
159c0 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
159d0 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  unable to determ
159e0 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20 6f  ine the status o
159f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
15a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15a10 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20  e does not open 
15a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15a30 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a   to examine its.
15a40 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e  ** content.  Hen
15a50 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ce, the journal 
15a60 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68  might contain th
15a70 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
15a80 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
15a90 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
15aa0 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65   deleted, and he
15ab0 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20  nce not be hot. 
15ac0 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   Or.** the heade
15ad0 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
15ae0 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64   might be zeroed
15af0 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74   out.  This rout
15b00 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ine.** does not 
15b10 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20 63  discover these c
15b20 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f  ases of a non-ho
15b30 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74  t journal - if t
15b40 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
15b50 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
15b60 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20   not empty this 
15b70 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
15b80 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54  it.** is hot.  T
15b90 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
15ba0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
15bb0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
15bc0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
15bd0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
15be0 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f   hot and will no
15bf0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
15c00 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
15c10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15c20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
15c30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
15c40 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
15c50 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
15c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
15c70 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 6c 6f 63  xists;.  int loc
15c80 6b 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ked;.  assert( p
15c90 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
15ca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
15cb0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
15cc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
15cd0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
15ce0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
15cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
15d00 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
15d10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
15d20 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
15d30 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69  S, &exists);.  i
15d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15d50 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
15d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15d70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15d80 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
15d90 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  ocked);.  }.  if
15da0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15db0 26 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f  && exists && !lo
15dc0 63 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  cked ){.    int 
15dd0 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20  nPage;.    rc = 
15de0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15df0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
15e00 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
15e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15e20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
15e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
15e40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
15e50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15e60 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
15e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
15e80 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
15e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15ea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15eb0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
15ec0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67  tent of page pPg
15ed0 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
15ee0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
15ef0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
15f00 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
15f10 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50  r, PgHdr *pPg, P
15f20 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
15f30 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65   rc;.  i64 offse
15f40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  t;.  assert( MEM
15f50 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  DB==0 );.  asser
15f60 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
15f70 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
15f80 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15f90 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
15fa0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65  ethods ){.    re
15fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15fc0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
15fd0 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67  }.  offset = (pg
15fe0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
15ff0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
16000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
16010 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
16020 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72  g->pData, pPager
16030 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
16040 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  et);.  PAGER_INC
16050 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
16060 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
16070 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
16080 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
16090 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
160a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
160b0 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e  gno));.  if( pgn
160c0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  o==1 ){.    memc
160d0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
160e0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
160f0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 2c 0a  Pg->pData)[24],.
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16130 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
16140 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20  ileVers));.  }. 
16150 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16160 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
16170 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47  >pgno, 3);.  PAG
16180 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20  ERTRACE4("FETCH 
16190 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
161a0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
161b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
161c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
161d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
161e0 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74  ash(pPg));.  ret
161f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16200 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16210 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
16220 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
16230 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
16240 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
16250 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
16260 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
16270 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16280 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
16290 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
162a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
162b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
162c0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
162d0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
162e0 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
162f0 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
16300 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
16310 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
16320 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
16330 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
16340 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
16350 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
16360 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
16370 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16380 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
16390 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
163a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
163b0 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  ;.  int isErrorR
163c0 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  eset = 0;..  /* 
163d0 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
163e0 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65   is opened for e
163f0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c  xclusive access,
16400 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
16410 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72  ing .  ** page r
16420 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73  eferences and is
16430 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
16440 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63  te, now is the c
16450 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
16460 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
16470 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
16480 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
16490 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61 74  -cache and treat
164a0 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a   any.  ** open j
164b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61  ournal file as a
164c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   hot-journal..  
164d0 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
164e0 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
164f0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
16500 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16510 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
16520 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61  Cache)==0 && pPa
16530 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20  ger->errCode .  
16540 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
16550 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
16560 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
16570 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
16580 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
16590 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
165a0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
165b0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
165c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
165d0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
165e0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
165f0 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
16600 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
16610 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
16620 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
16630 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
16640 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
16650 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
16660 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
16670 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
16680 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
16690 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
166a0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
166b0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
166c0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
166d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
166e0 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
166f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
16700 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
16710 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
16720 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
16730 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
16740 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
16750 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 61 73  tJournal;.    as
16760 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
16770 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16780 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
16790 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
167a0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
167b0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
167c0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
167d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
167e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
167f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
16800 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
16820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16830 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
16840 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
16850 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16860 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16870 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16880 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16890 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
168a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
168b0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
168c0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
168d0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
168e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
168f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
16900 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
16910 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
16920 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
16930 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
16940 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
16950 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
16960 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
16970 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
16980 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
16990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
169a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
169b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
169c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
169d0 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
169e0 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
169f0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
16a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16a20 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
16a30 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
16a40 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16a50 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16a60 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
16a70 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
16a80 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
16a90 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
16aa0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
16ab0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
16ac0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
16ad0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
16ae0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
16af0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
16b00 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
16b10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16b20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16b30 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16b40 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16b50 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  ing it .      **
16b60 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
16b70 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
16b80 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
16b90 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
16ba0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
16bb0 64 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  d, the.      ** 
16bc0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
16bd0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
16be0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
16bf0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
16c00 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
16c10 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
16c20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16c30 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
16c40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
16c50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
16c60 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16c70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16c80 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16c90 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
16ca0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
16cb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
16cd0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
16ce0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16cf0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
16d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16d10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
16d20 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
16d30 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  IVE;.      }. . 
16d40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
16d50 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
16d60 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
16d70 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
16d80 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63  in .      ** exc
16d90 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
16da0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
16db0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
16dc0 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
16dd0 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
16de0 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
16df0 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
16e00 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
16e10 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73   the.      ** Os
16e20 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
16e30 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
16e40 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
16e50 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
16e60 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
16e70 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
16e80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16e90 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
16ea0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
16eb0 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  alOpen==0 ){.   
16ec0 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
16ed0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16ee0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
16ef0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
16f00 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  ,SQLITE_ACCESS_E
16f10 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20  XISTS,&res);.   
16f20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16f40 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
16f50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
16f60 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
16f70 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
16f80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16f90 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
16fa0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
16fb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16fc0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16fd0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16ff0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
17000 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
17010 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
17020 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
17030 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17040 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
17050 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
17060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17070 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  f( fout&SQLITE_O
17080 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
170a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
170c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
170d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
170e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
170f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17100 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17110 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
17120 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
17130 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
17140 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
17150 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
17160 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20   rolled it back 
17170 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
17180 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17190 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
171a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
171b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
171c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
171d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
171e0 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
171f0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
17200 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 72  K .         && r
17210 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
17220 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 29  NOMEM .        )
17230 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
17240 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17260 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
17270 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
17280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
17290 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   1;.      pPager
172a0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
172b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
172c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
172d0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
172e0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
172f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
17300 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
17310 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
17320 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17330 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17350 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
17360 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
17370 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
17380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
17390 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
173a0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
173b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
173c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
173d0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
173e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
173f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
17400 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
17410 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
17420 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
17430 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20  ARED || .       
17440 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c     (pPager->excl
17450 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
17460 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
17470 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29  _SHARED).      )
17480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17490 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
174a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
174b0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
174c0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
174d0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
174e0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
174f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17500 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
17510 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
17520 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
17530 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
17540 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
17550 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
17560 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
17570 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
17580 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
17590 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
175a0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
175b0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
175c0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
175d0 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
175e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
175f0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
17600 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
17610 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
17620 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
17630 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
17640 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
17650 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
17660 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
17670 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
17680 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
17690 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
176a0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
176b0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
176c0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
176d0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
176e0 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
176f0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
17700 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
17710 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
17720 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17730 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
17740 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
17750 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
17760 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
17770 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
17780 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
17790 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
177a0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
177b0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
177c0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
177d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
177e0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
177f0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17800 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
17810 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17820 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
17830 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
17840 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
17850 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
17860 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17870 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
17880 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
17890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
178a0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
178b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
178c0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
178d0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
178e0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
178f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17900 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17910 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
17920 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17930 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
17940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17950 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
17960 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
17970 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
17980 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
17990 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
179a0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
179b0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
179c0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
179d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
179e0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
179f0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
17a00 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
17a10 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17a20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
17a30 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17a40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
17a50 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
17a60 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
17a70 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
17a80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
17a90 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
17aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
17ab0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17ac0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
17ad0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
17ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17af0 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
17b00 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
17b10 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
17b20 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
17b30 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
17b40 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
17b50 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17b70 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
17b80 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
17b90 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
17ba0 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
17bb0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
17bc0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
17bd0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
17be0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
17bf0 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
17c00 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
17c10 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
17c20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
17c30 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
17c40 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
17c50 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
17c60 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
17c70 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
17c80 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
17c90 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
17ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17cb0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
17cc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
17cd0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
17ce0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 20 29 7b  HDR_NEED_READ ){
17cf0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65  .    int rc = re
17d00 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50  adDbPage(pPg->pP
17d10 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e  ager, pPg, pPg->
17d20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
17d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17d40 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
17d50 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17d60 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  READ;.    }else{
17d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17da0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
17db0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
17dc0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
17dd0 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  , and the pager 
17de0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  is not in the.**
17df0 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 77 72 69   middle of a wri
17e00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
17e10 72 20 6f 70 65 6e 65 64 20 69 6e 20 65 78 63 6c  r opened in excl
17e20 75 73 69 76 65 20 6d 6f 64 65 2c 20 75 6e 6c 6f  usive mode, unlo
17e30 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74 61 74 69  ck it..*/ .stati
17e40 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
17e50 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
17e60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
17e70 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
17e80 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
17e90 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
17ea0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
17eb0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
17ec0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17ed0 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
17ee0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
17ef0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
17f00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
17f10 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
17f20 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
17f30 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
17f40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
17f50 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
17f60 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
17f70 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
17f80 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
17f90 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
17fa0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
17fb0 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
17fc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
17fd0 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
17fe0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
17ff0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18000 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
18010 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
18020 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
18030 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
18040 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
18050 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
18060 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
18070 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
18080 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
18090 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
180a0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
180b0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
180c0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
180d0 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
180e0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
180f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18100 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
18110 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
18120 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
18130 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
18140 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
18150 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
18160 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
18170 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
18180 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
18190 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
181a0 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
181b0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
181c0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
181d0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
181e0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
181f0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
18200 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
18210 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18220 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
18230 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
18240 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
18250 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
18260 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
18270 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
18280 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
18290 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
182a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
182b0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
182c0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
182d0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
182e0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
182f0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
18300 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
18310 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
18320 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
18330 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
18340 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
18350 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18360 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
18370 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
18380 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
18390 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
183a0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
183b0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
183c0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
183d0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
183e0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
183f0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
18400 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
18410 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
18420 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
18430 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
18440 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
18450 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
18460 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
18470 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
18480 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
18490 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
184a0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
184b0 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
184c0 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
184d0 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
184e0 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
184f0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
18500 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
18510 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
18520 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
18530 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
18540 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
18550 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
18560 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
18570 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
18580 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
18590 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
185a0 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
185b0 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
185c0 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
185d0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
185e0 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
185f0 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
18600 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18610 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
18620 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
18630 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
18640 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
18650 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
18660 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
18670 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
18680 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
18690 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
186a0 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
186b0 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
186c0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
186d0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
186e0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
186f0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
18700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18710 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
18720 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
18730 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
18740 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
18750 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
18760 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
18770 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
18780 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
18790 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
187a0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
187b0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
187c0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
187d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
187e0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
187f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18800 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
18810 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK .       || 
18820 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
18830 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
18840 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20  Cache)>0 .      
18850 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b   || pgno==1.  );
18860 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
18870 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
18880 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
18890 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
188a0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
188b0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
188c0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
188d0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
188e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
188f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
18900 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
18910 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
18920 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
18930 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18940 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
18950 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
18960 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
18970 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
18980 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
18990 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
189a0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
189b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
189c0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
189d0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
189e0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
189f0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
18a00 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
18a10 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
18a20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
18a30 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
18a40 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
18a50 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
18a60 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
18a70 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
18a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18aa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18ab0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
18ac0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20  UNLOCK );..  rc 
18ad0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
18ae0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
18af0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26  ache, pgno, 1, &
18b00 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pPg);.  if( rc!=
18b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18b30 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
18b40 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
18b50 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
18b60 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
18b70 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
18b80 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
18b90 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
18ba0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
18bb0 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47  nt nMax;.    PAG
18bc0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
18bd0 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d  nMiss);.    pPg-
18be0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
18bf0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18c00 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
18c10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
18c20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 70  pgno) ){.      p
18c30 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
18c40 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  DR_IN_JOURNAL;. 
18c50 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
18c60 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  pPg->pExtra, 0, 
18c70 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
18c80 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
18c90 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
18ca0 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
18cb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18cd0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18ce0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
18cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
18d00 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
18d10 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
18d20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
18d30 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
18d40 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
18d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18d60 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
18d70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18d80 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
18d90 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
18da0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
18db0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18dc0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  e);.      if( no
18dd0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
18de0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
18df0 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44   PGHDR_NEED_READ
18e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18e10 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
18e20 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
18e30 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
18e40 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
18e50 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
18e60 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
18e70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18e80 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
18e90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
18ea0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
18eb0 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  /* sqlite3PagerU
18ec0 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20  nref(pPg); */.  
18ed0 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
18ee0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
18ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18f00 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
18f10 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
18f20 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
18f30 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
18f40 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
18f50 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
18f60 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
18f70 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
18f80 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
18f90 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c 69  .    assert(sqli
18fa0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
18fb0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
18fc0 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  e)>0 || pgno==1)
18fd0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
18fe0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
18ff0 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
19000 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
19010 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
19020 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
19030 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
19040 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19050 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
19060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19080 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
19090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
190a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
190b0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
190c0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
190d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
190e0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
190f0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
19100 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
19110 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19120 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
19130 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19140 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
19150 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
19160 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
19170 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
19180 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
19190 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
191a0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
191b0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
191c0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
191d0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
191e0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
191f0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
19200 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
19210 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
19220 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
19230 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
19240 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
19250 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
19260 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
19270 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
19280 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
19290 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
192a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
192b0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
192c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
192d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
192e0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
192f0 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
19300 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29  e!=PAGER_UNLOCK)
19310 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
19320 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
19330 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  OK || pPager->er
19340 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
19350 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  LL).  ){.    sql
19360 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
19370 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
19380 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
19390 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
193a0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
193b0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
193c0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
193d0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
193e0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
193f0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
19400 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
19410 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
19420 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
19430 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
19440 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
19450 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
19460 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
19470 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19480 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
19490 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
194a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
194b0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
194c0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
194d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
194e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
194f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
19500 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
19510 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
19520 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
19530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19550 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
19560 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
19570 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
19580 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
19590 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
195a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
195b0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
195c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
195d0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
195e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
195f0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
19600 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19610 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
19620 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
19630 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
19640 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
19650 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
19660 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
19670 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
19680 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19690 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
196a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
196b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
196c0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
196d0 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
196e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
196f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
19700 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19710 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
19720 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
19730 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
19740 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
19750 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
19760 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
19770 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19780 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50  pPager, 0);.  pP
19790 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
197a0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
197b0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
197c0 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
197d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
197e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
197f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19800 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
19810 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
19820 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
19830 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
19840 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
19850 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
19860 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
19870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19880 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
19890 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
198a0 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
198b0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
198c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
198d0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
198e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
198f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
19900 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
19910 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
19920 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
19930 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
19940 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  d);.      rc = S
19950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
19960 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
19970 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
19980 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
19990 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
199a0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
199b0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
199c0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
199d0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
199e0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
199f0 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
19a00 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
19a10 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19a20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
19a30 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
19a40 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
19a50 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
19a60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
19a70 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
19a80 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
19a90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19aa0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
19ab0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
19ac0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
19ad0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
19ae0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
19b10 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  OMEM ){.        
19b20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
19b30 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
19b40 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
19b50 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66    }.      goto f
19b60 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19b70 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  urnal;.    }.  }
19b80 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
19b90 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
19ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
19bb0 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
19bc0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
19bd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
19be0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
19bf0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
19c00 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
19c10 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74  errCode;.    got
19c20 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
19c30 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
19c40 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19c50 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
19c60 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
19c70 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
19c80 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
19c90 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
19ca0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
19cb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
19cc0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
19cd0 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
19ce0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19cf0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
19d00 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21  ITE_NOMEM && rc!
19d10 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
19d20 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
19d30 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
19d40 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
19d50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
19d80 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
19d90 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
19da0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
19db0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  l:.  sqlite3Bitv
19dc0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
19dd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
19de0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
19df0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
19e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
19e10 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
19e20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19e30 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
19e40 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
19e50 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
19e60 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
19e70 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
19e80 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
19e90 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
19ea0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
19eb0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19ec0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
19ed0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
19ee0 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
19ef0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
19f00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19f10 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
19f20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
19f30 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
19f40 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
19f50 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
19f60 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
19f70 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
19f80 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
19f90 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
19fa0 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
19fb0 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
19fc0 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
19fd0 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
19fe0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
19ff0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1a000 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
1a010 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
1a020 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1a030 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
1a050 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
1a060 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
1a070 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
1a080 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
1a090 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a0a0 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
1a0b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1a0c0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
1a0d0 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
1a0e0 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
1a0f0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
1a100 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
1a110 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
1a120 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
1a130 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
1a140 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1a150 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
1a160 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
1a170 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
1a180 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
1a190 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1a1a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1a1b0 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
1a1c0 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
1a1d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a1e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1a1f0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
1a200 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
1a210 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
1a220 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
1a230 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
1a240 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
1a250 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
1a260 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
1a270 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
1a280 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
1a290 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1a2a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
1a2b0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1a2c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
1a2d0 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
1a2e0 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
1a2f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1a300 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1a310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1a320 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1a330 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a340 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1a350 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1a360 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a370 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1a380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a390 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1a3a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
1a3b0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
1a3c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 41    sqlite3PcacheA
1a3d0 73 73 65 72 74 46 6c 61 67 73 28 70 50 61 67 65  ssertFlags(pPage
1a3e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c 20 50  r->pPCache, 0, P
1a3f0 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29  GHDR_IN_JOURNAL)
1a400 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a410 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1a420 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
1a430 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  CK);.    if( rc=
1a440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a450 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1a460 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1a470 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78  ED;.      if( ex
1a480 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1a490 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1a4a0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1a4b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1a4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a4d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a4e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a4f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a500 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1a510 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 50  Cache = 0;.    P
1a520 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1a530 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1a540 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a550 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a560 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1a570 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a580 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
1a590 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1a5a0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1a5b0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1a5c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1a5d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1a5e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
1a5f0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1a600 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1a610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1a620 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1a630 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1a640 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1a650 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a660 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
1a670 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1a680 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1a690 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1a6a0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1a6b0 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1a6c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1a6d0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1a6e0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1a6f0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1a700 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1a710 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
1a720 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1a730 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
1a740 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
1a750 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
1a760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1a770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1a780 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1a790 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1a7a0 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1a7b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a7c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1a7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1a7e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1a7f0 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67  er, 0);.    pPag
1a800 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
1a810 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
1a820 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
1a830 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1a840 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
1a850 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1a860 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a880 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a890 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a8a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1a8b0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1a8c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1a8d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1a8e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a8f0 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1a900 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1a910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1a920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a930 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1a940 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1a950 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1a960 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1a970 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1a980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a990 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1a9a0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1a9b0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
1a9c0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
1a9d0 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1a9e0 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1a9f0 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1aa00 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1aa10 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1aa20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1aa30 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1aa40 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  r *pPg){.  sqlit
1aa50 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1aa60 6e 28 70 50 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n(pPg);.}.../*.*
1aa70 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
1aa80 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
1aa90 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
1aaa0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
1aab0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
1aac0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1aad0 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
1aae0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
1aaf0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
1ab00 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
1ab10 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
1ab20 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1ab30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ab40 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
1ab50 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
1ab60 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
1ab70 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
1ab80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1ab90 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
1aba0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
1abb0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
1abc0 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
1abd0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1abe0 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
1abf0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
1ac00 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
1ac10 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
1ac20 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
1ac30 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
1ac40 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
1ac50 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
1ac60 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1ac70 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
1ac80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
1ac90 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
1aca0 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
1acb0 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
1acc0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1acd0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1ace0 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
1acf0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
1ad00 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
1ad10 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
1ad20 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
1ad30 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1ad40 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
1ad50 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
1ad60 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
1ad70 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
1ad80 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
1ad90 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
1ada0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1adb0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1adc0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
1add0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
1ade0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1adf0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1ae00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ae10 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1ae20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1ae30 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ae40 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1ae50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ae60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ae70 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1ae80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ae90 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1aea0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1aeb0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1aec0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1aed0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1aee0 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1aef0 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1af00 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1af10 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1af20 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1af30 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1af40 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1af50 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1af60 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1af70 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1af80 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1af90 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1afa0 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1afb0 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1afc0 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1afd0 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1afe0 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1aff0 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1b000 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1b010 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1b020 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1b030 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1b040 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1b050 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1b060 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1b070 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1b080 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
1b090 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1b0a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1b0b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1b0c0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1b0d0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1b0e0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1b0f0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1b100 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1b110 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1b120 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1b130 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1b140 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1b150 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
1b160 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
1b170 29 0a 20 20 20 26 26 20 28 70 61 67 65 49 6e 53  ).   && (pageInS
1b180 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
1b190 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1b1a0 73 65 3d 3d 30 29 20 0a 20 20 29 7b 0a 20 20 20  se==0) .  ){.   
1b1b0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b1c0 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
1b1d0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
1b1e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1b1f0 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1b200 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1b210 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b220 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1b230 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to 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 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1b260 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1b270 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1b280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1b290 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1b2a0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1b2b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1b2c0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1b2d0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1b2e0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1b2f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1b300 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1b310 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1b320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b330 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1b340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b380 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b390 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1b3a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1b3b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b3c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1b3d0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50  .          && pP
1b3e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1b3f0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1b400 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
1b410 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1b420 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1b430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b450 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b460 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b470 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  ache = 1;.    pP
1b480 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1b490 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
1b4a0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1b4b0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
1b4c0 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
1b4d0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
1b4e0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1b4f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1b500 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1b510 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
1b520 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
1b530 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
1b540 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
1b550 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1b560 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1b570 20 20 69 66 28 20 21 28 70 50 67 2d 3e 66 6c 61    if( !(pPg->fla
1b580 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  gs&PGHDR_IN_JOUR
1b590 4e 41 4c 29 20 26 26 20 70 50 61 67 65 72 2d 3e  NAL) && pPager->
1b5a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1b5b0 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
1b5c0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
1b5d0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1b5e0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
1b5f0 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
1b600 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20   *pData2;..     
1b610 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1b620 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1b630 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b640 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1b650 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
1b660 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
1b670 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
1b680 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
1b690 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
1b6a0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
1b6b0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1b6c0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
1b6d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1b6e0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  er) );.        p
1b6f0 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1b700 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1b710 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
1b720 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
1b730 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
1b740 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
1b750 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
1b760 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1b770 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
1b780 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
1b790 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1b7a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b7c0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b7d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
1b7e0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1b7f0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b820 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
1b830 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b840 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
1b850 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
1b860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b890 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1b8a0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
1b8b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b8c0 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
1b8d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b8e0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
1b8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b900 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
1b910 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
1b920 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1b930 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
1b940 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b950 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
1b960 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
1b970 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
1b980 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1b990 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
1b9a0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b9b0 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
1b9c0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1b9d0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
1b9e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b9f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1ba00 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
1ba10 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
1ba20 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1ba30 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
1ba40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1ba50 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
1ba60 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
1ba70 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
1ba80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ba90 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
1baa0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1bab0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1bac0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1bad0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
1bae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1baf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bb00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1bb10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1bb20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1bb30 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1bb40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1bb50 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1bb60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
1bb70 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1bb80 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
1bb90 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1bba0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1bbb0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1bbc0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1bbd0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1bbe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bbf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bc00 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1bc10 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
1bc20 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
1bc30 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
1bc40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bc60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1bc70 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1bc80 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1bc90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1bca0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1bcb0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
1bcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
1bcd0 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
1bce0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1bcf0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1bd10 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1bd20 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
1bd30 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
1bd40 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1bd50 5f 53 59 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20  _SYNC)?1:0));.  
1bd60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bd70 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1bd80 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1bd90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1bda0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1bdb0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 66    }.      pPg->f
1bdc0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e  lags |= PGHDR_IN
1bdd0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a  _JOURNAL;.    }.
1bde0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1bdf0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1be00 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1be10 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1be20 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1be30 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1be40 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1be50 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1be60 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1be70 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1be80 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1be90 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1bea0 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1beb0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1bec0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1bed0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1bee0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1bef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bf00 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1bf10 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
1bf20 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1bf30 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
1bf40 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1bf50 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
1bf60 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1bf70 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
1bf80 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
1bf90 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1bfa0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1bfb0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1bfc0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1bfd0 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 61 73 73  o, 7);.      ass
1bfe0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
1bff0 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41  &PGHDR_IN_JOURNA
1c000 4c 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  L) .            
1c010 20 20 20 20 20 7c 7c 20 28 69 6e 74 29 70 50 67       || (int)pPg
1c020 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1c030 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1c040 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1c050 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64  its(pPager->stfd
1c060 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
1c070 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1c080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1c0a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c0b0 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
1c0c0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1c0d0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
1c0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41        }.      PA
1c0f0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1c100 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c110 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c120 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c130 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1c140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c150 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c170 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c180 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
1c190 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
1c1a0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=0 );.      sq
1c1b0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
1c1c0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
1c1d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c1e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1c1f0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1c200 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1c210 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c230 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1c240 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c250 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1c260 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1c270 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1c280 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
1c290 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
1c2a0 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
1c2b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1c2c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c2d0 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1c2e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c2f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c300 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1c310 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
1c320 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
1c330 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
1c340 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
1c350 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
1c360 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1c370 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
1c380 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
1c390 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
1c3a0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
1c3b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1c3c0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
1c3d0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
1c3e0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
1c3f0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
1c400 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
1c410 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
1c420 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
1c430 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
1c440 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1c450 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
1c460 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
1c470 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
1c480 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1c490 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1c4a0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
1c4b0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
1c4c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c4d0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
1c4e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c4f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
1c500 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1c510 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1c520 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c530 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
1c540 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
1c550 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
1c560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c570 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
1c580 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
1c590 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
1c5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1c5b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1c5c0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
1c5d0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
1c5e0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
1c5f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1c600 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1c610 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1c620 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
1c630 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1c640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c650 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
1c660 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
1c670 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
1c680 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
1c690 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
1c6a0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1c6b0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1c6c0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1c6d0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1c6e0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1c6f0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1c700 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1c710 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1c720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1c730 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1c740 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
1c750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c760 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
1c770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
1c780 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
1c790 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
1c7a0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
1c7b0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
1c7c0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
1c7d0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
1c7e0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
1c7f0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
1c800 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
1c810 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
1c820 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
1c830 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1c840 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1c850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
1c860 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
1c870 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
1c880 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
1c890 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1c8a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1c8b0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
1c8c0 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  unt);.    if( pP
1c8d0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
1c8e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1c8f0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
1c900 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
1c910 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
1c920 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
1c930 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1c940 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
1c950 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
1c960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
1c970 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
1c980 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
1c990 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
1c9a0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
1c9b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c9c0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
1c9d0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
1c9e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1c9f0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
1ca00 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
1ca10 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
1ca20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
1ca30 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
1ca40 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
1ca50 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
1ca60 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1ca70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
1ca80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
1ca90 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
1caa0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1cab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1cac0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1cad0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
1cae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1caf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1cb10 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
1cb20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1cb30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
1cb40 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1cb50 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
1cb60 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
1cb70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1cb90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1cba0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1cbb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1cbc0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
1cbd0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
1cbe0 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
1cbf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1cc00 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
1cc10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1cc20 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
1cc30 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
1cc40 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1cc50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
1cc60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1cc70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1cc80 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1cc90 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
1cca0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
1ccb0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
1ccc0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
1ccd0 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
1cce0 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
1ccf0 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
1cd00 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
1cd10 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
1cd20 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
1cd30 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
1cd40 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
1cd50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
1cd60 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
1cd70 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
1cd80 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
1cd90 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
1cda0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
1cdb0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1cdc0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
1cdd0 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
1cde0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
1cdf0 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
1ce00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
1ce10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
1ce20 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
1ce30 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
1ce40 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1ce50 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
1ce60 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
1ce70 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
1ce80 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e   pPage ) pPage->
1ce90 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1cea0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1ceb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1cec0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1ced0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1cee0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
1cef0 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
1cf00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1cf10 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
1cf20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1cf30 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
1cf40 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1cf50 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
1cf60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cf70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1cf80 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1cf90 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1cfa0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1cfb0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1cfc0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1cfd0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
1cfe0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1cff0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1d000 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1d010 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1d020 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1d030 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1d040 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1d050 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
1d060 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
1d070 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d080 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
1d090 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1d0a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1d0b0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1d0c0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1d0d0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1d0e0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1d0f0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
1d100 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1d110 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1d120 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1d130 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1d140 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
1d150 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
1d160 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
1d170 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
1d180 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
1d190 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
1d1a0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
1d1b0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
1d1c0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d1d0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1d1e0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1d1f0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1d200 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1d210 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1d220 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1d230 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1d240 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d250 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1d260 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1d270 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1d280 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1d290 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1d2a0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1d2b0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1d2c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1d2d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d2e0 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1d2f0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1d300 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1d310 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1d320 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d330 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
1d340 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1d350 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1d360 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1d370 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1d380 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1d390 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1d3a0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1d3b0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1d3c0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1d3d0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1d3e0 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1d3f0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1d400 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1d410 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1d420 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1d430 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1d440 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1d450 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1d460 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1d470 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1d480 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1d490 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1d4a0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1d4b0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
1d4c0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
1d4d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1d4e0 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1d4f0 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
1d500 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
1d510 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1d520 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1d530 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
1d540 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
1d550 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1d560 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
1d570 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1d580 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1d590 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
1d5a0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1d5b0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1d5c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d5d0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1d5e0 63 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  c;..  if( pPg->p
1d5f0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1d600 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  DbSize ){.    re
1d610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d620 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d630 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d640 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  k==0 ){.    asse
1d650 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1d660 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
1d670 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d680 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 42  lback = sqlite3B
1d690 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
1d6a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b  er->origDbSize);
1d6b0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1d6c0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d6d0 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  k ){.      retur
1d6e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1d6f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
1d700 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
1d710 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  t(pPager->pAlway
1d720 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e  sRollback, pPg->
1d730 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63  pgno);..  if( rc
1d740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1d750 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d760 5f 44 49 52 54 59 29 20 26 26 20 21 70 50 61 67  _DIRTY) && !pPag
1d770 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1d780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d790 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d7a0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1d7b0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1d7c0 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
1d7d0 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
1d7e0 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
1d7f0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
1d800 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1d810 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
1d820 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
1d830 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
1d840 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
1d850 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
1d860 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1d870 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
1d880 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d890 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
1d8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d8b0 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
1d8c0 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
1d8d0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
1d8e0 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
1d8f0 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
1d900 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
1d910 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
1d920 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1d930 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
1d940 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
1d950 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
1d960 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1d970 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
1d980 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
1d990 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
1d9a0 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
1d9b0 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
1d9c0 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
1d9d0 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
1d9e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1d9f0 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
1da00 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1da10 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1da20 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1da30 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1da40 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1da50 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
1da60 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
1da70 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1da80 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1da90 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
1daa0 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
1dab0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1dac0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1dad0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1dae0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1daf0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  if.    }.  }.  r
1db00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1db10 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1db20 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1db30 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1db40 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1db50 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1db60 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1db70 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1db80 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1db90 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1dba0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1dbb0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1dbc0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1dbd0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1dbe0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1dbf0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
1dc00 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
1dc10 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
1dc20 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
1dc30 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
1dc40 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1dc50 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
1dc60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
1dc70 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
1dc80 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
1dc90 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
1dca0 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
1dcb0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1dcc0 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
1dcd0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
1dce0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
1dcf0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
1dd00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1dd10 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
1dd20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1dd30 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1dd40 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ager;..  assert(
1dd50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1dd60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1dd70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
1dd80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1dd90 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
1dda0 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
1ddb0 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
1ddc0 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
1ddd0 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
1dde0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1ddf0 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
1de00 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
1de10 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1de20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1de30 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20  rnalOpen==0 .   
1de40 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
1de50 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c  Test(pPager->pAl
1de60 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50  waysRollback, pP
1de70 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70  g->pgno).   || p
1de80 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1de90 3e 6f 72 69 67 44 62 53 69 7a 65 0a 20 20 29 7b  >origDbSize.  ){
1dea0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1deb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1dec0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1ded0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20  if( (pPg->flags 
1dee0 26 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  & PGHDR_IN_JOURN
1def0 41 4c 29 21 3d 30 20 7c 7c 20 28 69 6e 74 29 70  AL)!=0 || (int)p
1df00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1df10 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1df20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
1df30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53  endif..  /* If S
1df40 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20  ECURE_DELETE is 
1df50 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
1df60 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
1df70 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f  hat this.  ** ro
1df80 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1df90 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f  led on a page fo
1dfa0 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50  r which sqlite3P
1dfb0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a  agerDontWrite().
1dfc0 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1dfd0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
1dfe0 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73  led during the s
1dff0 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ame transaction.
1e000 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e  .  ** And if Don
1e010 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65  tWrite() has pre
1e020 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c  viously been cal
1e030 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  led, the followi
1e040 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  ng.  ** conditio
1e050 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a  ns must be met..
1e060 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72    **.  ** (Later
1e070 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49  :)  Not true.  I
1e080 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e090 73 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 68  s corrupted by h
1e0a0 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a  aving duplicate.
1e0b0 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68    ** pages on th
1e0c0 65 20 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20  e freelist (ex: 
1e0d0 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29 20 74  corrupt9.test) t
1e0e0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1e0f0 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  g is not.  ** ne
1e100 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a  cessarily true:.
1e110 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74    */.  /* assert
1e120 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1e130 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1e140 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1e150 72 69 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a  rigDbSize ); */.
1e160 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e170 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1e180 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74   );.  sqlite3Bit
1e190 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1e1a0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
1e1b0 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66 6c  pgno);.  pPg->fl
1e1c0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f  ags |= PGHDR_IN_
1e1d0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50 67 2d 3e  JOURNAL;.  pPg->
1e1e0 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
1e1f0 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 69 66 28  NEED_READ;.  if(
1e200 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1e210 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
1e220 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
1e230 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze >= pPager->or
1e240 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1e250 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1e260 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
1e270 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1e280 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
1e290 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
1e2a0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1e2b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1e2c0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e2d0 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
1e2e0 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
1e2f0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1e300 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1e310 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e320 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
1e330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e340 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
1e350 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
1e360 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
1e370 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
1e380 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
1e390 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1e3a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1e3b0 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50  t isDirect){.  P
1e3c0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1e3d0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1e3e0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64  QLITE_OK;..#ifnd
1e400 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e410 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1e420 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
1e430 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72  ==0 );  /* isDir
1e440 65 63 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65  ect is only true
1e450 20 66 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74   for atomic writ
1e460 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  es */.#endif.  i
1e470 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1e480 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1e490 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e4a0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1e4b0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1e4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e4d0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1e4e0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1e4f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e500 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1e510 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
1e520 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1e530 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e540 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
1e550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1e570 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e580 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20  pPgHdr);.       
1e590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e5a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e5b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1e5c0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1e5d0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1e5e0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1e5f0 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1e600 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e610 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
1e620 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
1e630 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e640 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1e650 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
1e660 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
1e670 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1e680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1e690 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1e6a0 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69 72  TE.    if( isDir
1e6b0 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66  ect && pPager->f
1e6c0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1e6d0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
1e6e0 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
1e6f0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20  pData;.      rc 
1e700 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1e710 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
1e720 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
1e730 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  ize, 0);.    }.#
1e740 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
1e750 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1e760 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
1e770 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e780 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
1e790 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1e7a0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
1e7b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e7c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1e7d0 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
1e7e0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
1e7f0 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
1e800 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e810 74 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44  t rc;.  if( MEMD
1e820 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  B ){.    rc = SQ
1e830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1e840 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e850 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1e860 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1e870 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1e880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e890 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1e8a0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1e8b0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1e8c0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1e8d0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1e8e0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1e8f0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1e900 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1e910 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1e920 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1e930 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1e940 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1e950 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1e960 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1e970 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1e980 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1e990 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1e9a0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1e9b0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1e9c0 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1e9d0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1e9e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1e9f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1ea00 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1ea10 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1ea20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1ea30 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1ea40 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1ea50 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1ea60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1ea70 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1ea80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1ea90 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1eaa0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1eab0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1eac0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1ead0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1eae0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1eaf0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1eb00 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1eb10 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1eb20 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1eb30 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1eb40 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1eb50 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1eb60 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1eb70 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1eb80 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1eb90 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1eba0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
1ebb0 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
1ebc0 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
1ebd0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1ebe0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
1ebf0 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
1ec00 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ec10 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1ec20 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
1ec30 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
1ec40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
1ec50 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
1ec60 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
1ec70 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
1ec80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
1ec90 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
1eca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ecb0 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
1ecc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
1ecd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1ece0 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54  ster, .  Pgno nT
1ecf0 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79  runc,.  int noSy
1ed00 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
1ed10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1ed20 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1ed30 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1ed40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ed50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
1ed60 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
1ed70 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
1ed80 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
1ed90 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
1eda0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1edb0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
1edc0 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
1edd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1ede0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1edf0 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
1ee00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
1ee10 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
1ee20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ee30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ee40 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
1ee50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1ee60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1ee70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
1ee80 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1ee90 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1eea0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1eeb0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1eec0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1eed0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1eee0 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1eef0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1ef00 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1ef10 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1ef20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1ef30 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1ef40 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1ef50 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1ef60 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1ef70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1ef80 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1ef90 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1efa0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1efb0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1efc0 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
1efd0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1efe0 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
1eff0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1f000 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
1f010 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
1f020 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
1f030 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1f040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f050 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
1f060 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
1f070 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
1f080 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
1f090 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
1f0a0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
1f0b0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
1f0c0 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
1f0d0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
1f0e0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
1f0f0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
1f100 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
1f110 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1f120 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
1f130 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1f140 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
1f150 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
1f160 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1f170 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
1f180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
1f190 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
1f1a0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
1f1b0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
1f1c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
1f1d0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20  seAtomicWrite;. 
1f1e0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1f1f0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1f200 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1f210 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57  ;.    useAtomicW
1f220 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
1f230 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
1f240 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1f250 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20  urnalOpen &&.   
1f260 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f270 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
1f280 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
1f290 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
1f2a0 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
1f2b0 20 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67    (pPg==0 || pPg
1f2c0 2d 3e 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20  ->pDirty==0).   
1f2d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f2e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f2f0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1f300 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1f310 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1f320 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65  F );.    if( use
1f330 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
1f340 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
1f350 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
1f360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f370 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
1f380 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1f390 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
1f3a0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1f3b0 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
1f3c0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
1f3d0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1f3e0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1f3f0 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
1f400 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1f410 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1f420 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
1f430 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
1f440 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
1f450 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
1f460 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
1f470 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
1f480 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
1f490 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
1f4a0 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
1f4b0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
1f4c0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
1f4d0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1f4e0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1f4f0 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
1f500 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
1f510 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
1f520 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
1f530 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
1f540 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
1f550 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1f560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f570 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1f580 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1f590 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
1f5a0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1f5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f5c0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1f5d0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
1f5e0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
1f5f0 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72  if( !useAtomicWr
1f600 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ite && rc==SQLIT
1f610 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20  E_OK ).#endif.. 
1f620 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
1f630 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1f640 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
1f650 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f660 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
1f670 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
1f680 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
1f690 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
1f6a0 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
1f6b0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
1f6c0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
1f6d0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
1f6e0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
1f6f0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1f700 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
1f710 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
1f720 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
1f730 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
1f740 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
1f750 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
1f760 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f770 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
1f780 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f790 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
1f7a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
1f7b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1f7c0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
1f7d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f7e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f7f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28  _exit;.      if(
1f800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f810 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1f820 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23  NALMODE_OFF ){.#
1f830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f840 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f850 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1f860 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1f870 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1f880 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1f890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1f8a0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1f8b0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 20 20  pages.          
1f8c0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
1f8d0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
1f8e0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
1f8f0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1f900 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nal.          **
1f910 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
1f920 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67   */.          Pg
1f930 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  no i;.          
1f940 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45  int iSkip = PAGE
1f950 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1f960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
1f970 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1f980 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1f990 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1f9a0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
1f9b0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
1f9c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1f9d0 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
1f9e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1f9f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fa00 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1fa10 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  i, &pPg);.      
1fa20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1fa30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fa40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fa50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1fa60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fa70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
1fa80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1fa90 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1faa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1fab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fac0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fad0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fae0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1faf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1fb00 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
1fb10 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1fb20 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1fb30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fb40 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1fb50 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1fb60 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1fb70 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1fb80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1fb90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fba0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fbb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fbc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fbd0 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1fbe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1fbf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fc00 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1fc10 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1fc20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fc30 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fc40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1fc50 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1fc60 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1fc70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fc80 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 73 71   */.    pPg = sq
1fc90 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1fca0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1fcb0 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  ache);.    rc = 
1fcc0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1fcd0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
1fce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fcf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1fd00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
1fd10 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
1fd20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
1fd30 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66 74   might have left
1fd40 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
1fd50 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65  all fouled up he
1fd60 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74  re,.      ** but
1fd70 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
1fd80 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69 66  atter because if
1fd90 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72 74   the if the dirt
1fda0 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20  y list did.     
1fdb0 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65   ** get corrupte
1fdc0 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e  d, then the tran
1fdd0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c  saction will rol
1fde0 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20  l back and.     
1fdf0 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20   ** discard the 
1fe00 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65  dirty list.  The
1fe10 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74 20  re is an assert 
1fe20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  in.      ** page
1fe30 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1fe40 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65 72  pages() that ver
1fe50 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74  ifies that no at
1fe60 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69  tempt.      ** i
1fe70 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e  s made to use an
1fe80 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c   invalid dirty l
1fe90 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
1fea0 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78      goto sync_ex
1feb0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  it;.    }.    sq
1fec0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
1fed0 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
1fee0 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  che);..    /* Sy
1fef0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1ff00 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1ff10 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1ff20 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
1ff30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ff40 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1ff50 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1ff60 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
1ff70 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
1ff80 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1ff90 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
1ffa0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1ffb0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
1ffc0 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
1ffd0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
1ffe0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1fff0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
20000 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
20010 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  c_exit:.  if( rc
20020 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
20030 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a  LOCKED ){.    /*
20040 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
20050 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20  gecounter() may 
20060 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
20070 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  n an exclusive. 
20080 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70      * lock to sp
20090 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e  ill the cache an
200a0 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42  d return IOERR_B
200b0 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63  LOCKED. But sinc
200c0 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20  e .     * there 
200d0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65  is no chance the
200e0 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73   cache is incons
200f0 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20  istent, it is.  
20100 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72     * better to r
20110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
20120 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72  Y..     */.    r
20130 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
20140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20150 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
20160 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
20170 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
20180 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
20190 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
201a0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
201b0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
201c0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
201d0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
201e0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
201f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20200 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
20210 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
20220 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
20230 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
20240 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
20250 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
20260 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
20270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
20280 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
20290 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
202a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
202b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
202c0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
202d0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
202e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
202f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OR;.  }.  if( pP
20300 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
20310 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28  ==0 &&.        (
20320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20330 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
20340 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
20350 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
20360 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20370 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
20380 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
20390 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
203a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
203b0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
203c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
203d0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
203e0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
203f0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20400 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20410 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
20420 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
20430 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  | !pPager->dirty
20440 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20  Cache );.  rc = 
20450 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
20460 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
20470 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
20480 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
20490 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
204a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
204b0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
204c0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
204d0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
204e0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
204f0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
20500 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
20510 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
20520 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
20530 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
20540 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
20550 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
20560 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20570 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
20580 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
20590 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
205a0 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
205b0 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
205c0 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
205d0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
205e0 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
205f0 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
20600 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
20610 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
20620 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
20630 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
20640 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
20650 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
20660 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
20670 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
20680 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
20690 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
206a0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
206b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
206c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
206d0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
206e0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
206f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20700 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
20710 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
20720 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20730 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
20740 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
20750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20760 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
20770 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20780 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
20790 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
207a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
207b0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
207c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
207d0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
207e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
207f0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
20800 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
20810 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
20820 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
20830 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
20840 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
20850 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
20860 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
20870 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
20880 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
20890 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
208a0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
208b0 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
208c0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
208d0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
208e0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
208f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20910 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
20920 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20930 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20940 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
20950 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
20960 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
20970 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
20980 65 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  e = -1;.    }.. 
20990 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
209a0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
209b0 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
209c0 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
209d0 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
209e0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
209f0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
20a00 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
20a10 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
20a20 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
20a30 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
20a40 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
20a50 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
20a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20a70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20a80 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
20a90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
20aa0 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
20ab0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
20ac0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20ad0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
20ae0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
20af0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
20b00 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
20b10 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
20b20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
20b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20b40 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
20b50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20b60 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
20b70 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
20b80 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
20b90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
20ba0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
20bb0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
20bc0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
20bd0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
20be0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20bf0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
20c00 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
20c10 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
20c20 63 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50  count(DbPage *pP
20c30 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
20c40 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
20c50 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b  Refcount(pPage);
20c60 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
20c70 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
20c80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20c90 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
20ca0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
20cb0 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
20cc0 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
20cd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
20ce0 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
20cf0 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[0] = sqlite3P
20d00 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
20d10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20d20 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33    a[1] = sqlite3
20d30 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20d40 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20d50 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74  ;.  a[2] = sqlit
20d60 65 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65  e3PcacheGetCache
20d70 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
20d80 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20  ache);.  a[3] = 
20d90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20da0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
20db0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
20dc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20dd0 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
20de0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
20df0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
20e00 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
20e10 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
20e20 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
20e30 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
20e40 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
20e50 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
20e60 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74   return a;.}.int
20e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
20e80 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
20e90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
20ea0 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  MDB;.}.#endif../
20eb0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
20ec0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
20ed0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
20ee0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
20ef0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
20f00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20f10 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
20f20 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
20f30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
20f40 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
20f50 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
20f60 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
20f70 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
20f80 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
20f90 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
20fa0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
20fb0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d  tic int pagerStm
20fc0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
20fd0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
20fe0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
20ff0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
21000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21010 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21020 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
21030 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
21040 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
21050 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
21060 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
21070 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
21080 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
21090 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
210a0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
210b0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
210c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
210d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
210e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
210f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21100 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
21110 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
21120 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69  Stmt = sqlite3Bi
21130 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
21140 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
21150 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
21160 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
21170 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
21180 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
21190 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
211a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
211b0 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  M;.  }.  pPager-
211c0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
211d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
211e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
211f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
21200 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
21210 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
21220 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
21230 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
21240 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
21250 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
21260 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
21270 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
21280 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21290 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
212a0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
212b0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
212c0 3e 73 74 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >stfd);.    }els
212d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
212e0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
212f0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
21300 72 2d 3e 73 74 66 64 2c 20 53 51 4c 49 54 45 5f  r->stfd, SQLITE_
21310 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
21320 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
21330 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
21340 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
21350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21360 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21370 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
21380 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
21390 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
213a0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
213b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
213c0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
213d0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
213e0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
213f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
21400 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
21410 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
21420 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
21430 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
21440 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
21450 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
21460 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
21470 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
21480 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65  rc = pagerStmtBe
21490 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  gin(pPager);.  r
214a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
214b0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
214c0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
214d0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
214e0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
214f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
21500 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21510 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
21520 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
21530 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21540 65 72 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  er));.    sqlite
21550 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
21560 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
21570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
21580 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
21590 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
215a0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
215b0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
215c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
215d0 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
215e0 72 2d 3e 73 74 66 64 29 20 29 7b 0a 20 20 20 20  r->stfd) ){.    
215f0 20 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63    sqlite3OsTrunc
21600 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
21610 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
21620 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
21630 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
21640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21650 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
21660 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
21670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21680 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50  erStmtRollback(P
21690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
216a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
216b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
216c0 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
216d0 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
216e0 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
216f0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
21700 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
21710 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
21720 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
21730 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
21740 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
21750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21760 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
21770 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21780 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
21790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
217a0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
217b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
217c0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
217d0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
217e0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
217f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21800 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
21810 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
21820 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
21830 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
21840 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
21850 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
21860 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
21870 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21880 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21890 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
218a0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
218b0 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
218c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
218d0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
218e0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
218f0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
21900 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
21910 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
21920 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
21930 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
21940 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
21950 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21960 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
21970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21980 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
21990 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
219a0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
219b0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
219c0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
219d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
219e0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
219f0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
21a00 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
21a10 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
21a20 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
21a30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21a40 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
21a50 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21a60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21a70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
21a80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
21a90 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
21aa0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
21ab0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
21ac0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
21ad0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
21ae0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
21af0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
21b00 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
21b10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21b20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21b30 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
21b40 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
21b50 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
21b60 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
21b70 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
21b80 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
21b90 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
21ba0 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
21bb0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
21bc0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
21bd0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
21be0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
21bf0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
21c00 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
21c10 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
21c20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
21c30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21c40 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
21c50 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20  ve the page pPg 
21c60 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
21c70 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   in the file..**
21c80 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
21c90 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
21ca0 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76  to the page prev
21cb0 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
21cc0 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68  t.** pgno (which
21cd0 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29   we call pPgOld)
21ce0 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67   though that pag
21cf0 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
21d00 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20  be.** in cache. 
21d10 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65   If the page pre
21d20 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
21d30 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
21d40 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
21d50 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
21d60 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
21d70 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
21d80 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
21d90 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
21da0 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
21db0 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
21dc0 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
21dd0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
21de0 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
21df0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
21e00 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
21e10 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
21e20 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
21e30 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
21e40 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
21e50 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
21e60 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
21e70 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
21e80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21e90 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
21ea0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
21eb0 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
21ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
21ed0 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
21ee0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
21ef0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
21f00 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
21f10 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
21f20 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
21f30 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
21f40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
21f50 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e)..**.** If the
21f60 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
21f70 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e  , isCommit, is n
21f80 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
21f90 69 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  is page is being
21fa0 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72  .** moved as par
21fb0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
21fc0 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a  reorganization j
21fd0 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74  ust before the t
21fe0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69  ransaction .** i
21ff0 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
22000 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
22010 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
22020 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
22030 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67  ase page .** pPg
22040 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20   refers to will 
22050 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  not be written t
22060 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  o again within t
22070 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
22080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22090 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
220a0 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
220b0 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
220c0 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
220d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
220e0 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ld;  /* The page
220f0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
22100 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
22110 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
22120 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
22130 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
22140 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
22150 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
22160 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
22170 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
22180 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22190 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
221a0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
221b0 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
221c0 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
221d0 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
221e0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
221f0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70  gno, pgno))..  p
22200 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
22210 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
22220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
22230 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
22240 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67   before page pPg
22250 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20  ->pgno can.  ** 
22260 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73  be written to, s
22270 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
22280 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
22290 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
222a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
222b0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  isCommit flag is
222c0 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e   set, there is n
222d0 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
222e0 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  er that.  ** the
222f0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
22300 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
22310 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
22320 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20  ge pPg->pgno .  
22330 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
22340 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
22350 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
22360 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
22370 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20  te to it..  */. 
22380 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
22390 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
223a0 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29  ) && !isCommit )
223b0 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
223c0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
223d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
223e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 49 4e  ->flags&PGHDR_IN
223f0 5f 4a 4f 55 52 4e 41 4c 29 20 7c 7c 20 28 69 6e  _JOURNAL) || (in
22400 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  t)pgno>pPager->o
22410 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
22420 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
22430 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
22440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22450 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
22460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
22470 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
22480 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
22490 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
224a0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
224b0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
224c0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
224d0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
224e0 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
224f0 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
22500 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
22510 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
22520 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
22530 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
22540 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
22550 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c  ..  */.  pPg->fl
22560 61 67 73 20 26 3d 20 7e 28 50 47 48 44 52 5f 4e  ags &= ~(PGHDR_N
22570 45 45 44 5f 53 59 4e 43 7c 50 47 48 44 52 5f 49  EED_SYNC|PGHDR_I
22580 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 70 50  N_JOURNAL);.  pP
22590 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
225a0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
225b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
225c0 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
225d0 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
225e0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
225f0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
22600 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
22610 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
22620 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  }.  if( sqlite3B
22630 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
22640 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
22650 6e 6f 29 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  no) ){.    pPg->
22660 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49  flags |= PGHDR_I
22670 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 0a  N_JOURNAL;.  }..
22680 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22690 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
226a0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
226b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
226c0 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 30 29  eMove(pPgOld, 0)
226d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
226e0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 4f 6c  cheRelease(pPgOl
226f0 64 29 3b 0a 20 20 7d 0a 0a 20 20 6d 61 6b 65 44  d);.  }..  makeD
22700 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
22710 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
22720 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 1;.  pPager->d
22730 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
22740 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
22750 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
22760 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
22770 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
22780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22790 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
227a0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
227b0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
227c0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
227d0 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
227e0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
227f0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
22800 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
22810 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
22820 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
22830 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
22840 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
22850 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
22860 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
22870 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
22880 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
22890 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
228a0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
228b0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
228c0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
228d0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
228e0 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
228f0 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
22900 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
22910 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
22920 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
22930 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
22940 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
22950 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
22960 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
22970 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
22980 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
22990 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
229a0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
229b0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
229c0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
229d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
229e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
229f0 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
22a00 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
22a10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
22a20 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
22a30 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
22a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22a50 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
22a60 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
22a70 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
22a80 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
22a90 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
22aa0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
22ab0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
22ac0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
22ad0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
22ae0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
22af0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
22b00 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
22b10 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
22b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
22b30 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
22b40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
22b50 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
22b60 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
22b70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22b90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
22ba0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
22bb0 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70  )needSyncPgno<=p
22bc0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22bd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
22be0 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28  ite3BitvecClear(
22bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
22c00 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  al, needSyncPgno
22c10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22c30 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
22c40 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
22c50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22c60 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
22c70 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
22c80 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
22c90 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
22ca0 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
22cb0 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  = PGHDR_IN_JOURN
22cc0 41 4c 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74  AL;.    makeDirt
22cd0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
22ce0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
22cf0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
22d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d10 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
22d20 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
22d30 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
22d40 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
22d50 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
22d60 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
22d70 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
22d80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
22d90 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
22da0 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
22db0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
22dc0 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
22dd0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22de0 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
22df0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
22e00 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
22e10 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
22e20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
22e30 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
22e40 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
22e50 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
22e60 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
22e70 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
22e80 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
22e90 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61  ager?pPg->pExtra
22ea0 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
22eb0 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
22ec0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
22ed0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
22ee0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
22ef0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
22f00 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
22f10 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
22f20 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
22f30 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
22f40 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
22f50 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
22f60 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
22f70 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
22f80 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
22f90 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
22fa0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
22fb0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
22fc0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
22fd0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
22fe0 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
22ff0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
23000 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
23010 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
23020 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
23030 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
23040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23050 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
23060 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23070 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
23080 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
23090 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
230a0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
230b0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
230c0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
230d0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
230e0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
230f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
23100 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
23110 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
23120 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
23130 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
23140 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
23150 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
23160 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
23170 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
23180 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
23190 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
231a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
231b0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
231c0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
231d0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
231e0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
231f0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
23200 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
23210 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
23220 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
23230 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
23240 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
23250 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
23260 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
23270 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
23280 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
23290 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
232a0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
232b0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
232c0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
232d0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a  NALMODE_OFF.**.*
232e0 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
232f0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
23300 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
23310 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  al-mode is set t
23320 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  o the.** value s
23330 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
23340 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64  The returned ind
23350 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  icate the curren
23360 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
23370 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  ted).** journal-
23380 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
23390 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
233a0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
233b0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
233c0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
233d0 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
233e0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
233f0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
23400 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
23410 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23420 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
23430 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
23440 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
23450 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
23470 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
23480 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
23490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
234a0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
234b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
234d0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
234e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
234f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23500 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23510 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20  E_QUERY<0 );.   
23520 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
23530 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23540 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f  ournalMode = eMo
23550 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  de;.    }else{. 
23560 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f       assert( eMo
23570 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
23580 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20  LMODE_QUERY );. 
23590 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
235a0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
235b0 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
235c0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
235d0 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64   size-limit used
235e0 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
235f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
23600 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
23610 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
23620 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
23630 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
23640 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
23650 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
23660 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
23670 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
23680 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
23690 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
236a0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
236b0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
236c0 20 2a 2f 0a                                       */.